
Real Amazon Interview Experience
4 Rounds: Vanilla JS Machine Coding, DSA + JS Output, Frontend System Design & Bar Raiser
Round 1: Vanilla JS Machine Coding (60 mins)
On livecode.com. No IDE, no autocomplete, no React. Pure HTML, CSS, and vanilla JavaScript. They start with a base problem and keep extending it with follow-ups. You need to write clean, accessible, production-quality code without any framework.
š Build a 5-Star Rating with Hover Preview and Committed Value
Difficulty: Medium | Time: 20 minutes (base) + extensions
⢠Hover shows preview (highlight stars up to cursor)
⢠Click commits the rating
⢠Mouse leave reverts to committed value
<!-- HTML -->
<div class="star-rating" role="radiogroup" aria-label="Rating">
<span class="star" data-value="1">ā
</span>
<span class="star" data-value="2">ā
</span>
<span class="star" data-value="3">ā
</span>
<span class="star" data-value="4">ā
</span>
<span class="star" data-value="5">ā
</span>
</div>
<style>
.star-rating { display: flex; gap: 4px; cursor: pointer; }
.star { font-size: 2rem; color: #ddd; transition: color 0.1s; }
.star.active, .star.hover { color: #FFD700; }
</style>
<script>
const container = document.querySelector('.star-rating');
const stars = container.querySelectorAll('.star');
let committedRating = 0;
function highlightStars(count, className) {
stars.forEach((star, i) => {
star.classList.toggle(className, i < count);
});
}
container.addEventListener('mouseover', (e) => {
const star = e.target.closest('.star');
if (!star) return;
const value = parseInt(star.dataset.value);
highlightStars(value, 'hover');
});
container.addEventListener('mouseleave', () => {
stars.forEach(star => star.classList.remove('hover'));
});
container.addEventListener('click', (e) => {
const star = e.target.closest('.star');
if (!star) return;
committedRating = parseInt(star.dataset.value);
highlightStars(committedRating, 'active');
});
// Initialize
highlightStars(committedRating, 'active');
</script>Extension 1: Half-Star Support Using clip-path<!-- Each star becomes two halves -->
<style>
.star-container { position: relative; display: inline-block; font-size: 2rem; }
.star-half {
position: absolute; top: 0; left: 0;
overflow: hidden; width: 50%;
clip-path: inset(0 50% 0 0); /* Show only left half */
}
.star-full { color: #ddd; }
.star-half.active, .star-full.active { color: #FFD700; }
</style>
<script>
// Track half values: 0.5, 1, 1.5, 2, ...
container.addEventListener('mousemove', (e) => {
const star = e.target.closest('[data-value]');
if (!star) return;
const rect = star.getBoundingClientRect();
const isLeftHalf = (e.clientX - rect.left) < rect.width / 2;
const value = parseInt(star.dataset.value);
const rating = isLeftHalf ? value - 0.5 : value;
highlightStarsWithHalf(rating);
});
function highlightStarsWithHalf(rating) {
stars.forEach((star, i) => {
const fullValue = i + 1;
const halfEl = star.querySelector('.star-half');
const fullEl = star.querySelector('.star-full');
if (fullValue <= rating) {
// Full star
fullEl.classList.add('active');
halfEl.classList.add('active');
} else if (fullValue - 0.5 === rating) {
// Half star
halfEl.classList.add('active');
fullEl.classList.remove('active');
} else {
fullEl.classList.remove('active');
halfEl.classList.remove('active');
}
});
}
</script>Extension 2: Keyboard Support with ARIA<div class="star-rating" role="radiogroup" aria-label="Rating"
tabindex="0" aria-valuenow="0" aria-valuemin="0" aria-valuemax="5">
<!-- stars -->
</div>
<script>
container.setAttribute('tabindex', '0');
container.addEventListener('keydown', (e) => {
switch (e.key) {
case 'ArrowRight':
case 'ArrowUp':
e.preventDefault();
committedRating = Math.min(5, committedRating + 0.5);
break;
case 'ArrowLeft':
case 'ArrowDown':
e.preventDefault();
committedRating = Math.max(0, committedRating - 0.5);
break;
case 'Home':
e.preventDefault();
committedRating = 0;
break;
case 'End':
e.preventDefault();
committedRating = 5;
break;
}
container.setAttribute('aria-valuenow', committedRating);
highlightStarsWithHalf(committedRating);
});
// Screen reader announcement
container.setAttribute('role', 'slider');
container.setAttribute('aria-valuemin', '0');
container.setAttribute('aria-valuemax', '5');
container.setAttribute('aria-valuenow', committedRating);
container.setAttribute('aria-label', 'Star rating');
</script>⢠Can you build without frameworks? (Core JS/DOM knowledge)
⢠Event delegation vs individual listeners
⢠Accessibility (ARIA, keyboard) ā this is non-negotiable at Amazon
⢠Progressive enhancement ā base works, extensions layer on top
š Variant: Accordion with Single-Open & Multi-Open Mode
Difficulty: Medium | Time: 25 minutes
⢠Single-open mode: only one panel open at a time
⢠Multi-open mode: any number of panels can be open
⢠Smooth height animation
⢠Keyboard accessible (Enter/Space to toggle)
class Accordion {
constructor(container, { mode = 'single' } = {}) {
this.container = container;
this.mode = mode; // 'single' or 'multi'
this.panels = container.querySelectorAll('.accordion-panel');
this.init();
}
init() {
this.panels.forEach((panel) => {
const header = panel.querySelector('.accordion-header');
const content = panel.querySelector('.accordion-content');
// Set initial state
content.style.maxHeight = '0';
content.style.overflow = 'hidden';
content.style.transition = 'max-height 0.3s ease';
header.setAttribute('role', 'button');
header.setAttribute('tabindex', '0');
header.setAttribute('aria-expanded', 'false');
header.addEventListener('click', () => this.toggle(panel));
header.addEventListener('keydown', (e) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
this.toggle(panel);
}
});
});
}
toggle(panel) {
const content = panel.querySelector('.accordion-content');
const header = panel.querySelector('.accordion-header');
const isOpen = panel.classList.contains('open');
if (this.mode === 'single' && !isOpen) {
// Close all others first
this.panels.forEach((p) => {
if (p !== panel) this.close(p);
});
}
if (isOpen) {
this.close(panel);
} else {
panel.classList.add('open');
content.style.maxHeight = content.scrollHeight + 'px';
header.setAttribute('aria-expanded', 'true');
}
}
close(panel) {
const content = panel.querySelector('.accordion-content');
const header = panel.querySelector('.accordion-header');
panel.classList.remove('open');
content.style.maxHeight = '0';
header.setAttribute('aria-expanded', 'false');
}
}
// Usage
const el = document.querySelector('.accordion');
const accordion = new Accordion(el, { mode: 'single' });
// Switch mode dynamically
// accordion.mode = 'multi';š Variant: Relative Time Widget
Difficulty: Medium | Time: 15 minutes
function getRelativeTime(timestamp) {
const now = Date.now();
const diff = now - new Date(timestamp).getTime();
const seconds = Math.floor(diff / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
const days = Math.floor(hours / 24);
const months = Math.floor(days / 30);
const years = Math.floor(days / 365);
if (seconds < 60) return 'just now';
if (minutes < 60) return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;
if (hours < 24) return `${hours} hour${hours > 1 ? 's' : ''} ago`;
if (days < 30) return `${days} day${days > 1 ? 's' : ''} ago`;
if (months < 12) return `${months} month${months > 1 ? 's' : ''} ago`;
return `${years} year${years > 1 ? 's' : ''} ago`;
}
// Auto-updating widget
class RelativeTimeWidget {
constructor(element) {
this.element = element;
this.timestamp = element.getAttribute('data-timestamp');
this.update();
this.startAutoUpdate();
}
update() {
this.element.textContent = getRelativeTime(this.timestamp);
this.element.setAttribute('title', new Date(this.timestamp).toLocaleString());
}
startAutoUpdate() {
// Update every minute for recent, less for older
const diff = Date.now() - new Date(this.timestamp).getTime();
const interval = diff < 3600000 ? 60000 : 3600000; // 1min or 1hr
this.timer = setInterval(() => this.update(), interval);
}
destroy() {
clearInterval(this.timer);
}
}
// Usage
// <time data-timestamp="2026-06-22T10:30:00Z" class="relative-time"></time>
document.querySelectorAll('.relative-time').forEach(el => {
new RelativeTimeWidget(el);
});š” Interview Tips for Round 1:
- No React allowed: Practice building components with vanilla JS, addEventListener, and DOM manipulation
- Accessibility is mandatory: Amazon cares deeply about a11y ā always add ARIA attributes and keyboard support
- Event delegation:Use it. Don't attach listeners to every element individually.
- CSS matters: clip-path, transitions, flexbox ā know them without looking up docs
- 60 minutes goes fast: Get the base working in 15-20 min, then handle extensions
Amazon's machine coding is pure vanilla JS. If you can't build it without React, you're not ready. Master DOM manipulation and vanilla JS patterns ā
Round 2: DSA + JS Output (60 mins)
Starts with 15 minutes of behavioral questions, then moves to DSA on a shared document. They also ask JS output questions to test your understanding of the language fundamentals.
1ļøā£ Row with Maximum Ones in a Row-Sorted Binary Matrix
Platform: LeetCode | Difficulty: Medium | Time: 15 min
Given an mĆn binary matrix where each row is sorted (all 0s before all 1s), find the row with the maximum number of 1s.
Output: 1 (row index 1 has 3 ones ā maximum)
function rowWithMaxOnes(matrix) {
const rows = matrix.length;
const cols = matrix[0].length;
let maxRow = -1;
let col = cols - 1; // Start top-right corner
for (let row = 0; row < rows; row++) {
// Move left while we see 1s
while (col >= 0 && matrix[row][col] === 1) {
col--;
maxRow = row;
}
}
return maxRow;
}
// How it works:
// Start at top-right. If current cell is 1, move left (this row has more 1s).
// If current cell is 0, move down (this row can't beat current best).
// The "staircase" path guarantees we visit at most m + n cells.
// Time: O(m + n) ā much better than O(m * log n) binary search approach
// Space: O(1)
// Test
console.log(rowWithMaxOnes([
[0, 0, 1, 1],
[0, 1, 1, 1], // ā This row (index 1) has max ones
[0, 0, 0, 1],
[0, 0, 1, 1]
])); // Output: 1⢠Brute force: O(m Ć n) ā count ones in each row
⢠Binary search for first 1: O(m Ć log n) ā good but not optimal
⢠Staircase walk: O(m + n) ā best, leverages sorted property
2ļøā£ Clone a Directed Graph (LeetCode 133)
Platform: LeetCode | Difficulty: Medium | Time: 15 min
Given a reference to a node in a connected directed graph, return a deep copy (clone) of the graph. Each node contains a value and a list of its neighbors.šÆ Solution ā BFS with HashMap:
class GraphNode {
constructor(val, neighbors = []) {
this.val = val;
this.neighbors = neighbors;
}
}
function cloneGraph(node) {
if (!node) return null;
const visited = new Map(); // original ā clone mapping
const queue = [node];
// Create clone of starting node
visited.set(node, new GraphNode(node.val));
while (queue.length > 0) {
const current = queue.shift();
for (const neighbor of current.neighbors) {
if (!visited.has(neighbor)) {
// Clone unvisited neighbor
visited.set(neighbor, new GraphNode(neighbor.val));
queue.push(neighbor);
}
// Connect clone's neighbor
visited.get(current).neighbors.push(visited.get(neighbor));
}
}
return visited.get(node);
}
// DFS alternative (recursive):
function cloneGraphDFS(node, visited = new Map()) {
if (!node) return null;
if (visited.has(node)) return visited.get(node);
const clone = new GraphNode(node.val);
visited.set(node, clone);
for (const neighbor of node.neighbors) {
clone.neighbors.push(cloneGraphDFS(neighbor, visited));
}
return clone;
}
// Time: O(V + E) ā visit every vertex and edge once
// Space: O(V) ā HashMap stores all nodesKey Insight: The HashMap prevents infinite loops (handles cycles) and ensures each node is cloned exactly once.3ļøā£ JS Output: Closures Inside a for Loop ā var vs let
// With var
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log('var:', i), 100);
}
// With let
for (let j = 0; j < 3; j++) {
setTimeout(() => console.log('let:', j), 100);
}
// Output:
// var: 3
// var: 3
// var: 3
// let: 0
// let: 1
// let: 2Why:var ā function-scoped. All 3 closures share the SAME variable. By the time setTimeout fires, i is already 3.ā¢
let ā block-scoped. Each iteration gets its OWN copy of j. The closure captures the value at that iteration.// Fix 1: IIFE
for (var i = 0; i < 3; i++) {
((index) => {
setTimeout(() => console.log(index), 100);
})(i);
}
// Fix 2: setTimeout's third argument
for (var i = 0; i < 3; i++) {
setTimeout((index) => console.log(index), 100, i);
}4ļøā£ JS Output: setTimeout, Promise.then, async/await Order
console.log('start');
setTimeout(() => console.log('timeout'), 0);
Promise.resolve()
.then(() => {
console.log('promise 1');
return Promise.resolve();
})
.then(() => console.log('promise 2'));
async function run() {
console.log('async start');
await Promise.resolve();
console.log('async end');
}
run();
console.log('end');Output:Each
await and .then() schedules the continuation as a microtask. All microtasks drain before the next macrotask.5ļøā£ __proto__ vs prototype vs Object.create
// prototype ā property on constructor FUNCTIONS
function Dog(name) { this.name = name; }
Dog.prototype.bark = function() { return this.name + ' barks'; };
// __proto__ ā internal link on every OBJECT (instance)
const rex = new Dog('Rex');
rex.__proto__ === Dog.prototype; // true
rex.__proto__.__proto__ === Object.prototype; // true (chain ends here)
rex.__proto__.__proto__.__proto__ === null; // true (end of chain)
// Object.create ā creates object with specified prototype
const animal = { breathe() { return 'breathing'; } };
const cat = Object.create(animal);
cat.breathe(); // 'breathing' (inherited via prototype chain)
cat.__proto__ === animal; // true
// Summary:
// prototype ā exists on functions, shared by all instances made with 'new'
// __proto__ ā exists on objects, points to constructor's prototype (use Object.getPrototypeOf)
// Object.create ā manually sets __proto__ without using new/constructorš” Interview Tips for Round 2:
- Say complexity first: Before writing code, state the time and space complexity of your approach
- DSA topics that repeat: Trees, matrices, arrays, and graphs ā practice these heavily
- JS output questions: Practice event loop, closures, hoisting, and
thisbinding - Think out loud: Explain your thought process ā they want to see how you reason
- Behavioral (15 min): Use STAR format, keep answers under 2 minutes, use numbers
DSA is non-negotiable at Amazon. Trees, matrices, and graph problems come up in every single loop. Get structured DSA practice with interview patterns ā
Round 3: Frontend System Design (60 mins)
On a Miro board. Component tree first, API second. They want to see you think at scale ā not just build a page, but design a system that can handle millions of users, dynamic content, and real-time updates.
š Design the Home Page of a News Site (like Times of India)
Difficulty: Hard | Time: 60 minutes
⢠Multiple content types: articles, videos, ads
⢠Category-based sections (Top Stories, Sports, Tech, etc.)
⢠Infinite scroll / pagination
⢠Breaking news banner (real-time)
⢠Responsive layout
Non-Functional:
⢠Fast first load (LCP < 2.5s)
⢠Millions of users, high traffic spikes on breaking news
⢠SEO critical (news must be indexed)
⢠Ads must not block content rendering
// Component Tree
<HomePage>
<BreakingNewsBanner /> // WebSocket/SSE for real-time
<NavigationBar />
<HeroSection /> // Top 3-5 stories, above the fold
<ContentFeed>
<FeedSection category="top-stories">
<ContentCard type="article" />
<ContentCard type="video" />
<ContentCard type="ad" /> // Discriminator-based rendering
</FeedSection>
<FeedSection category="sports" />
<FeedSection category="tech" />
<InfiniteScrollTrigger /> // Intersection Observer
</ContentFeed>
<Sidebar>
<TrendingWidget />
<WeatherWidget />
</Sidebar>
</HomePage>Step 3: Card Schema with Discriminator Field// Unified card schema ā type field determines rendering
interface BaseCard {
id: string;
type: 'article' | 'video' | 'ad'; // Discriminator
position: number;
timestamp: string;
}
interface ArticleCard extends BaseCard {
type: 'article';
headline: string;
summary: string;
thumbnail: string;
author: string;
category: string;
readTime: number;
}
interface VideoCard extends BaseCard {
type: 'video';
title: string;
duration: number;
thumbnailUrl: string;
hlsUrl: string;
}
interface AdCard extends BaseCard {
type: 'ad';
adProvider: string;
adSlotId: string;
size: 'banner' | 'medium-rect' | 'native';
}
type FeedCard = ArticleCard | VideoCard | AdCard;
// Renderer uses discriminator to pick component
function CardRenderer({ card }: { card: FeedCard }) {
switch (card.type) {
case 'article': return <ArticleCardComponent data={card} />;
case 'video': return <VideoCardComponent data={card} />;
case 'ad': return <AdCardComponent data={card} />;
}
}Step 4: Cursor-Based Pagination + Infinite Scroll// API Design ā cursor-based (not offset-based)
// GET /api/feed?cursor=abc123&limit=20&category=top-stories
// Response:
{
"items": [...FeedCard],
"nextCursor": "xyz789", // Opaque cursor for next page
"hasMore": true
}
// Why cursor > offset:
// - Offset breaks when new items are inserted (duplicates/skips)
// - Cursor is stable even when feed changes
// - Better for real-time content where items are constantly added
// Client implementation with Intersection Observer
function useInfiniteScroll(fetchFn) {
const [items, setItems] = useState([]);
const [cursor, setCursor] = useState(null);
const [hasMore, setHasMore] = useState(true);
const observerRef = useRef(null);
const loadMore = useCallback(async () => {
const { items: newItems, nextCursor, hasMore } = await fetchFn(cursor);
setItems(prev => [...prev, ...newItems]);
setCursor(nextCursor);
setHasMore(hasMore);
}, [cursor]);
// Intersection Observer for trigger element
const lastItemRef = useCallback((node) => {
if (observerRef.current) observerRef.current.disconnect();
observerRef.current = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting && hasMore) loadMore();
}, { rootMargin: '200px' }); // Pre-fetch 200px before visible
if (node) observerRef.current.observe(node);
}, [hasMore, loadMore]);
return { items, lastItemRef, hasMore };
}Step 5: SSR vs Client Rendering Decision⢠Above-the-fold content (hero, top stories) ā SEO + fast FCP
⢠Article content pages ā must be crawlable
⢠Meta tags and structured data
Client Render:
⢠Infinite scroll (subsequent pages) ā loaded on demand
⢠Ads ā loaded async, shouldn't block SSR
⢠Interactive widgets (weather, trending) ā personalized
⢠Breaking news banner ā WebSocket updates
Hybrid: SSR first page + client-side hydration + client fetch for pagination
// Architecture for real-time breaking news:
// Option 1: Server-Sent Events (SSE) ā simpler, one-directional
const eventSource = new EventSource('/api/breaking-news/stream');
eventSource.onmessage = (event) => {
const news = JSON.parse(event.data);
showBreakingBanner(news);
};
// Option 2: WebSocket ā bidirectional, if needed
const ws = new WebSocket('wss://api.example.com/breaking');
ws.onmessage = (event) => {
const news = JSON.parse(event.data);
showBreakingBanner(news);
};
// Backend flow:
// 1. Editor publishes breaking news via CMS
// 2. CMS triggers event to pub/sub (Redis/Kafka)
// 3. WebSocket server receives event, broadcasts to all connected clients
// 4. Client receives, shows banner with animation
// Total latency: < 2 seconds end-to-end
// Fallback for disconnected users:
// - Poll /api/breaking-news every 30s
// - Service Worker push notification
// - On reconnect, fetch latest breaking newsLazy Loading Images:// Native lazy loading (simplest)
<img src="article.jpg" loading="lazy" alt="..." />
// With blur-up placeholder pattern:
// 1. Serve tiny base64 thumbnail inline (< 1KB)
// 2. Use Intersection Observer to load full image
// 3. Crossfade from placeholder to full image
// Priority hints for above-the-fold:
<img src="hero.jpg" fetchpriority="high" alt="..." /> // Above fold
<img src="article.jpg" loading="lazy" alt="..." /> // Below foldš” System Design Tips for Amazon:
- Start with requirements: Functional ā Non-functional ā Constraints. Spend 5 minutes here.
- Component tree first, API second:This is Amazon's preferred order. Show the visual hierarchy.
- Think about scale: How does this work with 10M users? What breaks? Where do you cache?
- SSR vs CSR:Always justify your choice. "SEO needs SSR, personalization needs CSR."
- Performance budget: Mention LCP, FID, CLS. Show you think about Core Web Vitals.
Frontend System Design at Amazon is about thinking at scale ā not just components, but architecture decisions that impact millions. Practice system design with expert feedback ā
Round 4: Bar Raiser (60 mins)
Behavioral questions mapped to Amazon's 16 Leadership Principles, plus one DSA follow-up. The Bar Raiser is a senior interviewer from a different team whose job is to ensure the hiring bar stays high. This round is veto-capable ā a "no" here overrides all other rounds.
1ļøā£ Tell me about a time you disagreed with your tech lead
Leadership Principle: Have Backbone; Disagree and Commit
⢠You don't just go along to avoid conflict
⢠Once a decision is made, you commit fully even if you disagree
⢠You focus on what's best for the customer/product
Situation: What was being decided, stakes, your role
Task: Why you disagreed, what evidence you had
Action: How you raised it, what alternative you proposed, how the conversation went
Result: What was the outcome, what did you learn
2ļøā£ A project where you delivered under a tight deadline
Leadership Principle: Deliver Results / Bias for Action
⢠What was the deadline and why was it tight?
⢠What trade-offs did you make? (scope, quality, approach)
⢠How did you prioritize?
⢠Did you cut corners or find a creative solution?
⢠Quantify: "Delivered 2 days early" or "Shipped to 500K users on day 1"
3ļøā£ A time you took ownership outside your scope
Leadership Principle: Ownership
⢠You noticed a problem nobody was solving
⢠You didn't wait for permission or assignment
⢠The impact was measurable
⢠It was genuinely outside your job description
Examples that work well:
⢠Fixed a production bug in a service you don't own
⢠Set up monitoring/alerting for the team
⢠Improved CI/CD pipeline that was slowing everyone down
⢠Mentored a struggling teammate without being asked
4ļøā£ A launch that failed. What did you learn?
Leadership Principle: Learn and Be Curious / Invent and Simplify
2. Your role in the failure ā take genuine accountability
3. Root cause ā what was the real reason (not just symptoms)
4. Learning ā what changed in your approach after this
5. Prevention ā what systems did you put in place
5ļøā£ Follow-up DSA: Lowest Common Ancestor in a Binary Tree (LC Medium)
Platform: LeetCode 236 | Difficulty: Medium | Time: 15 min
function lowestCommonAncestor(root, p, q) {
// Base cases
if (!root) return null;
if (root === p || root === q) return root;
// Search in left and right subtrees
const left = lowestCommonAncestor(root.left, p, q);
const right = lowestCommonAncestor(root.right, p, q);
// If both sides return non-null, current node is the LCA
if (left && right) return root;
// Otherwise, LCA is on whichever side returned non-null
return left || right;
}
// How it works:
// 1. If current node IS p or q, return it
// 2. Recurse left and right
// 3. If BOTH sides found something ā current node is the LCA
// 4. If only ONE side found ā propagate that up (LCA is deeper)
// Time: O(n) ā visit each node once
// Space: O(h) ā recursion stack, h = height of tree
// Example:
// 3
// / \
// 5 1
// / \
// 6 2
//
// LCA(5, 1) = 3 (split at root)
// LCA(5, 6) = 5 (5 is ancestor of 6)Why Amazon Asks This:ā Tests recursive thinking on trees
ā Clean, concise solution shows clarity of thought
ā Common follow-ups: BST version (easier), iterative with parent pointers
š” Bar Raiser Tips:
- Prepare 8-10 stories: Map them to different Leadership Principles. One story can cover multiple LPs.
- Use numbers in EVERY answer:"40% faster" beats "we improved it." "Saved 3 hours/week for 12 engineers" beats "improved process."
- Keep answers under 2 minutes:They will ask follow-ups. Don't monologue.
- "I" not "we": They want YOUR contribution. Be specific about what YOU did.
- The DSA follow-up: Usually a medium-level tree/graph problem. Practice LCA, BST operations, and BFS/DFS.
The Bar Raiser has veto power. Your behavioral stories need to be as prepared as your code. Practice mock behavioral interviews with structured feedback ā
Tips That Actually Help at Amazon
Trees, matrices, and arrays come up in every loop. Practice at least 2 medium problems daily for 4 weeks.
60 minutes goes fast. Practice star rating, accordion, carousel in vanilla JS without any references.
"40 percent faster" beats "we improved it". Quantify impact in all behavioral stories.
Start with requirements, then components, then API. Amazon loves structured thinking.
Before writing any code, state the complexity of your approach. This shows you think before you code.
The Bar Raiser maps every question to an LP. Have 2 stories per principle ready to go.
Ready to Crack Your Amazon Interview?
Join our cohort and get structured preparation with 1-on-1 guidance from a Staff Engineer who has mentored 100+ developers.
