{"id":958,"date":"2026-06-24T17:33:56","date_gmt":"2026-06-24T17:33:56","guid":{"rendered":"https:\/\/lastroundai.com\/blog\/?post_type=iq&#038;p=958"},"modified":"2026-07-19T10:54:09","modified_gmt":"2026-07-19T05:24:09","slug":"google-l4","status":"publish","type":"iq","link":"https:\/\/lastroundai.com\/interview-questions\/google-l4","title":{"rendered":"Google L4 Interview Questions (2026): What They Actually Ask"},"content":{"rendered":"<p>A candidate who went through the Google L4 loop in late 2024 described the coding round this way: &#8220;The problem itself was a medium. But then they just kept going. Four follow-up questions. Each one harder than the last.&#8221; That pattern, a reasonable starting question followed by a sequence of constraints that compounds difficulty, shows up in almost every reported Google L4 experience from 2024 through early 2026. The problem is usually solvable. The follow-ups are where the bar actually sits.<\/p>\n<p>Google&#8217;s L4 is the mid-level software engineer band, roughly three to six years of experience, and the interview is almost entirely algorithm-heavy coding. No dedicated system design round at L4 (that arrives at L5), but there is one Googleyness round, which Google uses to assess cultural fit across six specific traits. This page covers what the 2026 Google L4 loop actually looks like, based on verified candidate reports from Glassdoor, Blind, interviewing.io, and first-person write-ups published between 2024 and mid-2026. The questions below are sourced from those accounts. I&#8217;ve noted where something is reported from a single source only.<\/p>\n<div class=\"iq-stats not-prose\"><div class=\"iq-stat\"><span class=\"iq-stat__value\">6-10 weeks<\/span><span class=\"iq-stat__label\">Process<\/span><\/div><div class=\"iq-stat\"><span class=\"iq-stat__value\">4-5<\/span><span class=\"iq-stat__label\">Rounds<\/span><\/div><div class=\"iq-stat\"><span class=\"iq-stat__value\">LC Medium-Hard<\/span><span class=\"iq-stat__label\">Coding<\/span><\/div><div class=\"iq-stat\"><span class=\"iq-stat__value\">Virtual + in-person (2025 shift)<\/span><span class=\"iq-stat__label\">Format<\/span><\/div><\/div>\n<div class=\"iq-dsec iq-dsec--easy\"><div class=\"iq-dsec__row\"><h2 class=\"iq-dsec__h\" id=\"easy\"><span class=\"iq-dsec__dot\" aria-hidden=\"true\"><\/span>Easy questions<\/h2><span class=\"iq-dsec__n\">15<\/span><\/div><div class=\"iq-dsec__bar\" aria-hidden=\"true\"><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Binary tree level order traversal<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">BFS \/ Trees<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>BFS with a queue. Initialize the queue with the root. At each level, process all nodes currently in the queue, adding their children for the next level. Collect node values into a list per level. Edge case: empty tree.<\/p>\n<p>Often a warm-up question or embedded within a harder problem. The variant Google interviewers reach for most frequently: &#8220;return nodes in zigzag order,&#8221; alternating left-to-right and right-to-left by level. That extension requires a direction flag and either reversing every other level&#8217;s list or using a deque.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\nfrom collections import deque\ndef level_order(root):\n\n    if not root:\n\n        return []\n\n    result, queue = [], deque([root])\n\n    while queue:\n\n        level = []\n\n        for _ in range(len(queue)):\n\n            node = queue.popleft()\n\n            level.append(node.val)\n\n            if node.left:\n\n                queue.append(node.left)\n\n            if node.right:\n\n                queue.append(node.right)\n\n        result.append(level)\n\n    return result\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Describe a time you had to handle a conflict with a teammate<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Conflict resolution stories should include the specific nature of the disagreement (not &#8220;we had different opinions&#8221; but &#8220;they wanted to rewrite the entire service; I thought we should isolate the broken module&#8221;), how you surfaced it constructively, and whether the resolution actually stuck. &#8220;We talked it out and agreed&#8221; is not a complete answer. What changed after the conversation, and how do you know the change held?<\/p>\n<p>Reported from a 2025 Googleyness round where the candidate said the interviewer asked specifically about the aftermath, not just the resolution moment. Google cares about durable outcomes, not one-off conversations.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Tell me about a time you improved a process or system without anyone asking you to<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>This maps to the &#8220;putting users first&#8221; and &#8220;doing the right thing&#8221; Googleyness traits. The strongest answers involve spotting a pain point (slow CI pipeline, flaky test suite, manual deployment step) that others had accepted as normal, quantifying its cost (2 hours per engineer per week), and shipping a fix that persisted after you moved on. The &#8220;without being asked&#8221; element matters: Google wants engineers who identify problems, not just execute on assigned tickets.<\/p>\n<p>One specific pattern that scores well here: the candidate noticed the problem through user or teammate feedback, not because it affected them directly. That signals user-first orientation.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Why Google? What draws you to this role specifically?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Generic answers about scale, impact, or &#8220;working on products used by billions&#8221; do not land well at Google. They hear that in every interview. What works: specificity about the team&#8217;s actual work, a product or infrastructure challenge that connects to your background, or a technical direction at Google that you&#8217;ve thought about and have an informed opinion on.<\/p>\n<p>Do homework on what the specific team ships. If it is a Search infrastructure role, that&#8217;s the 2024 Search quality updates and the indexing pipeline changes. If it is a YouTube team, that&#8217;s the live streaming latency work. If you cannot get specifics from the recruiter, ask directly: &#8220;What is the team&#8217;s top priority in 2026?&#8221; That question itself is a signal.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Tell me about a time you went out of your way for a user, even though it wasn&#039;t technically your job<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Maps to &#8220;put the user first.&#8221; The strongest stories describe noticing a user-facing problem that wasn&#8217;t on your team&#8217;s roadmap and either fixing it directly or escalating it loudly enough that someone did, with a concrete before-and-after: fewer support tickets, lower error rate, a specific latency number.<\/p>\n<p>Candidates who reach for an actual customer or end user in the example score better than ones who substitute a teammate for &#8220;user.&#8221; The trait is specifically about people outside your immediate team, and interviewers reportedly notice when a candidate quietly swaps in an easier internal example.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Does Google ask system design questions at L4?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Not as a standard round. System design is formally part of the L5 and above evaluation at Google. Multiple candidate reports from 2024 and 2025 confirm that L4 onsites typically include two to three coding rounds plus one Googleyness round. That said, a few teams include a lighter design conversation within the hiring manager call, and some candidates are simultaneously evaluated against the L5 bar, in which case a design round may appear. Ask your recruiter directly for your specific loop format.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">How long does the Google L4 interview process take?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Most candidates report six to ten weeks from initial application to verbal offer. The phone screen typically happens one to two weeks after the GHA. Onsites are scheduled one to three weeks after the phone screen clears. Hiring committee review after the onsite adds another one to two weeks. Referrals and recruiter-sourced candidates often move faster, sometimes four to five weeks total. The hiring committee review is the step with the most variance in timing.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">What coding language should I use for Google interviews?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Python is the most commonly used language in reported Google interviews and is generally preferred for its readability in a shared Google Doc. Java and C++ are also accepted. The shared Doc format means there is no syntax highlighting or autocomplete, so using a language with clean, readable syntax matters more than usual. Whatever you choose, know the standard library cold: Python&#8217;s collections module, heapq, and itertools come up constantly, and fumbling with syntax in a Doc with no autocomplete wastes time.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">How difficult are Google&#039;s coding problems compared to LeetCode?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Phone screen: medium difficulty, sometimes on the easier end of medium. Onsite coding rounds: medium to hard, with follow-up constraints that often push a medium problem into hard territory. The &#8220;Count Range Sum&#8221; problem (hard) has been specifically reported at L4 onsites. A practical benchmark from candidate reports: if you can solve 70% of LeetCode mediums and 30% of hards in 30 minutes with a clean explanation, you are roughly at the bar. Speed matters less than correctness and communication.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">What is the Google Hiring Assessment and can I fail it?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>The GHA is a 30 to 45 minute personality-and-culture screen with about 50 Likert-scale questions. It is not a coding test. Google does use it as a filter before the recruiter call in some pipelines, so candidates who rush through it or answer inconsistently can get screened out before their resume reaches a human reviewer. Answer honestly and consistently. There are no objectively correct answers, but large inconsistencies between related questions flag the screener.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Is Google interviewing in-person or virtually in 2026?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Both, and increasingly a hybrid. As of 2025, Google has been requiring at least one in-person round for candidates within commuting distance of a Google office, partly in response to AI-assisted cheating concerns during virtual coding sessions. For candidates geographically remote from a Google office, fully virtual loops are still available. The format for your specific loop will be communicated by your recruiter. The coding environment is identical either way: a shared Google Doc with no editor tooling.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">What happens after the Google onsite? How does the hiring committee decide?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Each interviewer submits a written packet, not just a numeric score, describing what they observed in detail. A hiring committee made up of engineers and managers who never interviewed you then reviews the full set of packets and makes the call without meeting you in person. If approved, most L4 candidates move into a separate Team Match process to be paired with a specific team, and Google&#8217;s final leveling can occasionally shift up or down slightly during that stage based on team fit.<\/p>\n<p>Reported: this two-stage structure surprises a lot of candidates who assume the interview loop itself makes the final decision. Multiple 2025 write-ups describe waiting two to three weeks between hiring committee approval and being matched to an actual team, which is separate time from the interview process itself.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Can I reapply if I get rejected in the Google L4 loop?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Yes, but Google enforces a cooldown before you can interview again. The most commonly reported window is 12 months after a full-loop rejection, sometimes shorter for candidates rejected earlier in the process, such as at the recruiter screen or phone screen stage. The exact window isn&#8217;t published anywhere official, and recruiters give different numbers depending on the specific req and how the rejection was recorded internally.<\/p>\n<p>Reported: candidates who reapply after addressing one specifically named weakness from their prior loop describe better outcomes than those who just say they &#8220;practiced more&#8221; in general. Vague, undirected re-preparation reportedly gets flagged in a similar way to the first attempt.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">What is the difference between a stack and a queue, and when would you use each?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Data structures<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>A stack is last-in-first-out. The last element you push is the first one you pop. A queue is first-in-first-out. The first element you enqueue is the first one you dequeue. Both support O(1) insert and remove when implemented correctly, the difference is purely about which end you&#8217;re allowed to touch.<\/p>\n<p>Stacks show up in call frames (the actual function call stack), undo\/redo history, parsing balanced parentheses, and depth-first traversal, since you naturally want to explore the most recently discovered node first. Queues show up in breadth-first traversal, task scheduling, and any producer-consumer setup where fairness matters, like a print queue or a request buffer, because you want to process things in the order they arrived rather than the order you most recently saw them.<\/p>\n<p>One gotcha interviewers like to probe: implementing a queue with two stacks. You push everything onto an &#8220;in&#8221; stack, and when you need to dequeue, you pop everything from &#8220;in&#8221; into an &#8220;out&#8221; stack (reversing the order) and pop from &#8220;out&#8221;. Each element moves at most twice across its lifetime, so the amortized cost per operation is still O(1) even though a single dequeue can occasionally be O(n).<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">What is Big O notation and why do interviewers care about it?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Complexity analysis<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Big O describes how the running time or memory use of an algorithm grows as the input size n grows, ignoring constant factors and lower-order terms. O(n) means the work scales linearly with input size, O(n log n) is what you get from good sorting algorithms and divide-and-conquer approaches, O(n squared) usually means nested loops over the same collection, and O(log n) means you&#8217;re cutting the problem in half at each step, like binary search.<\/p>\n<p>Interviewers care about it because it&#8217;s the fastest way to tell whether a candidate&#8217;s solution will actually work at scale, not just on the small example in front of them. A brute force O(n squared) solution that checks every pair might pass on an input of 10 elements and time out on an input of 10 million, which is exactly the kind of thing that breaks in production. Asking for the complexity forces you to reason about your own solution instead of pattern-matching to a memorized answer.<\/p>\n<p>It&#8217;s also worth knowing the difference between average case and worst case, and being able to state both. A hash map lookup is O(1) on average but O(n) in the worst case if every key collides into the same bucket. Google interviewers will sometimes push on this specifically, asking what happens if your hash function is bad or your input is adversarial, so having an answer ready for the worst case, not just the happy path, shows you actually understand the data structure rather than just having used it.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-dsec iq-dsec--medium\"><div class=\"iq-dsec__row\"><h2 class=\"iq-dsec__h\" id=\"medium\"><span class=\"iq-dsec__dot\" aria-hidden=\"true\"><\/span>Medium questions<\/h2><span class=\"iq-dsec__n\">23<\/span><\/div><div class=\"iq-dsec__bar\" aria-hidden=\"true\"><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Find the length of the longest substring without repeating characters<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Sliding Window<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Sliding window with two pointers and a hash set. The left pointer advances whenever a duplicate is found, removing the leftmost character from the set. Track the maximum window size seen. Time complexity O(n), space O(min(n, alphabet size)).<\/p>\n<p>Reported from a 2025 phone screen. The follow-up almost always extends to: &#8220;What if the string contains Unicode characters instead of ASCII?&#8221; The answer changes the space complexity bound, since the character set is no longer bounded by 128. The interviewer is checking whether you understand why you chose the data structure, not just that you did.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\ndef length_of_longest_substring(s: str) -&gt; int:\n\n    char_set = set()\n\n    left = 0\n\n    max_len = 0\n\n    for right in range(len(s)):\n\n        while s[right] in char_set:\n\n            char_set.remove(s[left])\n\n            left += 1\n\n        char_set.add(s[right])\n\n        max_len = max(max_len, right \u2013 left + 1)\n\n    return max_len\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Merge overlapping intervals<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Arrays<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Sort by start time. Iterate through the list; if the current interval&#8217;s start is less than or equal to the previous merged interval&#8217;s end, extend the end. Otherwise append a new interval. Common edge cases to discuss: single interval, all intervals overlapping, intervals that touch exactly (e.g., [1,3] and [3,5], most Google interviewers want these merged).<\/p>\n<p>Reported from multiple L4 onsites and at least two phone screens. Shows up with different framings: meeting rooms, calendar events, time blocks. The underlying structure is always the same. One candidate&#8217;s 2024 write-up described four follow-up questions after the base solution, ending with &#8220;what if intervals can be added dynamically and you need to query the merged state after each insertion?&#8221;<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\ndef merge(intervals: list[list[int]]) -&gt; list[list[int]]:\n\n    intervals.sort(key=lambda x: x[0])\n\n    merged = [intervals[0]]\n\n    for start, end in intervals[1:]:\n\n        if start &lt;= merged[-1][1]:\n\n            merged[-1][1] = max(merged[-1][1], end)\n\n        else:\n\n            merged.append([start, end])\n\n    return merged\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Word break: determine if a string can be segmented into dictionary words<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Dynamic Programming<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Bottom-up DP. Boolean array dp where dp[i] is true if s[0:i] can be segmented. For each index i, check all j from 0 to i: if dp[j] is true and s[j:i] is in the word set, set dp[i] to true. Time O(n^2 * m) where m is average word length for the substring check; use a hash set for O(1) word lookups.<\/p>\n<p>Reported from a phone screen and an onsite in 2024. Follow-up: &#8220;Return all valid segmentations, not just whether one exists.&#8221; That shifts the problem from DP to backtracking with memoization, and the state space is much larger. Interviewers want to hear you articulate the shift in approach before implementing.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Group a list of strings into anagrams of each other<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Hash Map<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Build a hash map where the key is a canonical form of each word (either the sorted character string, or a fixed-length count vector of the 26 lowercase letters) and the value is the list of original words that share that key. One pass through the input, one hash map. Time is O(n * k log k) with sorting as the key, or O(n * k) with a count vector, where k is average word length.<\/p>\n<p>Reported from several 2024-2025 phone screens as a warm-up before a harder string problem. The follow-up worth having ready: &#8220;the sorted-string key is O(k log k) per word, can you do better?&#8221; The count-vector key answers that directly, and most candidates don&#8217;t reach for it until prompted, which is exactly why interviewers ask.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Compute the product of every element except itself, without using division<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Arrays<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Two passes. First pass builds a prefix-product array where each index holds the product of every element to its left. Second pass walks right to left, multiplying a running suffix product into the prefix array as it goes. No division anywhere, so a zero anywhere in the input never causes a divide-by-zero edge case to handle separately.<\/p>\n<p>Reported from multiple 2024 phone screens. The instinctive first answer (divide the total product by each element) gets rejected immediately once you say it out loud, since division isn&#8217;t allowed and zeros in the input break it anyway. Interviewers want to see you reach for prefix and suffix products without being told division is banned.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\ndef product_except_self(nums: list[int]) -&gt; list[int]:\n\n    n = len(nums)\n\n    result = [1] * n\n\n    prefix = 1\n\n    for i in range(n):\n\n        result[i] = prefix\n\n        prefix *= nums[i]\n\n    suffix = 1\n\n    for i in range(n \u2013 1, -1, -1):\n\n        result[i] *= suffix\n\n        suffix *= nums[i]\n\n    return result\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Find the minimum number of coins needed to make a target amount<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Dynamic Programming<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Bottom-up 1D DP. dp[amount] holds the fewest coins needed to make that amount, initialized to infinity except dp[0] = 0. For each amount from 1 up to the target, try every coin denomination and take dp[amount &#8211; coin] + 1 if that&#8217;s smaller than the current value. If dp[target] is still infinity at the end, the amount can&#8217;t be made with the given coins.<\/p>\n<p>Reported from a phone screen in late 2024. The follow-up that shows up almost every time: &#8220;now return one valid combination of coins, not just the count.&#8221; That requires tracking which coin was used at each dp index and walking backward from the target once the table is filled, which is a different kind of bookkeeping than the count-only version.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Number of islands in a 2D grid<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">DFS \/ Graphs<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>DFS or BFS from each unvisited land cell. Mark visited cells in-place (change &#8216;1&#8217; to &#8216;0&#8217; or a separate visited array). Each DFS call from a new &#8216;1&#8217; increments the island count. Time O(m*n), space O(m*n) for the recursion stack in the worst case (grid entirely land).<\/p>\n<p>Reported from multiple 2025 onsite rounds. Follow-ups go fast here: &#8220;What if the grid is too large to fit in memory?&#8221; (stream rows, track boundary cells). &#8220;What if cells connect diagonally?&#8221; (add 4 more neighbor directions). &#8220;What is the area of the largest island?&#8221; (track size during DFS). Having these extensions ready to discuss matters.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Autocomplete system using a trie<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Trie<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Build a trie where each node stores the character and a list (or priority queue) of the top-k most frequent completions seen at that prefix. On insert, walk down the trie updating frequency counts and propagating the top-k candidates up the prefix chain. On search, return the stored candidates at the prefix node in O(prefix length) time.<\/p>\n<p>Reported from a 2025 L4 onsite. This is a real product-flavored question: &#8220;Implement search autocomplete.&#8221; Interviewers care about the trade-off discussion as much as the code. Storing top-k at every node is O(n * k) space but gives O(1) query time per prefix character. Alternatives: walk the subtrie on every query (less space, slower queries). Having a position on the trade-off before coding is expected.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Detect a cycle in a directed graph<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Graphs<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>DFS with two sets: a visited set and a recursion stack. If DFS encounters a node that&#8217;s already in the recursion stack, a cycle exists. After fully exploring a node&#8217;s neighbors, remove it from the stack. The standard visited set alone is not enough for directed graphs; a node can be visited from two different paths without implying a cycle.<\/p>\n<p>Reported from a phone screen in late 2024. The most common follow-up: &#8220;How does this change for an undirected graph?&#8221; The undirected version only needs a visited set and parent tracking, since an edge back to the parent is not a cycle. Expect the follow-up to lead into topological sort, which builds directly on cycle detection in directed graphs.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\ndef has_cycle(graph: dict) -&gt; bool:\n\n    visited = set()\n\n    rec_stack = set()\n    def dfs(node):\n\n        visited.add(node)\n\n        rec_stack.add(node)\n\n        for neighbor in graph.get(node, []):\n\n            if neighbor not in visited:\n\n                if dfs(neighbor):\n\n                    return True\n\n            elif neighbor in rec_stack:\n\n                return True\n\n        rec_stack.remove(node)\n\n        return False\n    return any(dfs(node) for node in graph if node not in visited)\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Schedule the maximum number of non-overlapping meetings<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Greedy<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Greedy interval scheduling. Sort meetings by end time (not start time, this is where candidates go wrong). Greedily select each meeting that starts at or after the end of the last selected meeting. This produces the maximum count. Proof: choosing the meeting that ends earliest always leaves the most room for future meetings.<\/p>\n<p>Reported from an L4 onsite in 2025 in a slightly different form: &#8220;You have a list of meetings with start and end times. What is the maximum number of meetings one person can attend?&#8221; Interviewers push on why you sort by end time rather than start time. The answer is not just correct but needs a clear justification.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Find the lowest common ancestor of two nodes in a binary tree<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Trees<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Recursive DFS. If the current node is null or matches either target node, return it. Otherwise recurse into both the left and right subtrees. If both recursive calls return a non-null result, the current node is the split point and therefore the answer. If only one side returns non-null, pass that result upward.<\/p>\n<p>Reported as one of the most common warm-up questions across both phone screens and onsites, often given before a harder graph problem in the same round. Two follow-ups show up repeatedly: &#8220;what changes if the tree is a binary search tree&#8221; (you can skip one branch entirely using the BST ordering property, giving O(log n) instead of O(n)), and &#8220;what if nodes have a parent pointer instead&#8221; (the problem collapses into finding the intersection point of two linked lists).<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\ndef lowest_common_ancestor(root, p, q):\n\n    if root is None or root == p or root == q:\n\n        return root\n\n    left = lowest_common_ancestor(root.left, p, q)\n\n    right = lowest_common_ancestor(root.right, p, q)\n\n    if left and right:\n\n        return root\n\n    return left if left else right\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Given course prerequisites, determine if it&#039;s possible to finish all courses<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Graphs<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Model courses as nodes and prerequisites as directed edges, then run Kahn&#8217;s algorithm: compute the in-degree of every node, push all zero-in-degree nodes into a queue, and repeatedly pop a node, &#8220;complete&#8221; it, and decrement the in-degree of its neighbors, pushing any that hit zero. If the total number of processed nodes equals the total number of courses, every course is finishable; if fewer, a cycle exists somewhere in the graph and finishing is impossible.<\/p>\n<p>Reported as the direct continuation of the directed-cycle-detection question earlier in this page, and candidate write-ups describe interviewers presenting it in the exact same interview session as a natural next step: the DFS-with-recursion-stack cycle check above tells you a cycle exists, this problem asks you to also produce a valid ordering when one doesn&#8217;t.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Create a deep copy of a graph, including cycles<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Graphs<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>DFS or BFS from the given starting node, using a hash map from original node to its cloned counterpart. Before recursing into a neighbor, check whether it&#8217;s already in the map; if so, use the existing clone instead of creating a new one and recursing again, which is what prevents infinite loops when the graph contains cycles.<\/p>\n<p>Reported from several 2024-2025 phone screens, usually presented with a small diagram of 4-6 nodes. Almost every candidate who fails this gets stuck re-cloning the same node repeatedly in a cycle; the hash-map-before-you-recurse ordering is the entire trick, and it&#8217;s easy to get backward under time pressure.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Search for a target value in a rotated sorted array<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Binary Search<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Modified binary search. At each step, check which half of the current range (left-to-mid or mid-to-right) is properly sorted, then check whether the target falls inside that sorted half&#8217;s value range. If it does, search that half; if it doesn&#8217;t, the target must be in the other half, even though that half isn&#8217;t sorted on its own.<\/p>\n<p>Reported as a frequent phone screen filter question. It&#8217;s treated less as a hard problem and more as a &#8220;did you actually get the boundary conditions right&#8221; check: the difference between <= and <, and how duplicate values break the \"which half is sorted\" logic, are exactly the kind of off-by-one mistakes that a shared Google Doc with no compiler won't catch for you.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Find the kth largest element in a stream of numbers<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Heap<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Maintain a min-heap of size k. For each new number, push it onto the heap, and if the heap grows past size k, pop the smallest element off. The root of the heap is always the kth largest value seen so far. Each insertion is O(log k).<\/p>\n<p>The static-array version of this question (find the kth largest element in a fixed array) can be solved faster on average with quickselect, but Google interviewers reportedly prefer rephrasing it as a stream specifically because quickselect doesn&#8217;t work incrementally. That reframing is a deliberate way to force the heap-based answer rather than the average-case-faster one.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Tell me about a time you led a project from start to finish without being asked to<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Google wants end-to-end ownership. The story should cover how you identified the problem, how you mobilized resources or people without formal authority, what blocked you, and what the concrete outcome was (shipped by date X, reduced latency by Y ms, removed Z lines of tech debt). The phrase &#8220;without being asked to&#8221; is in the question for a reason: they want proactive behavior, not task completion.<\/p>\n<p>Reported from a 2025 Googleyness round. The follow-up after this question is almost always &#8220;what would you have done differently?&#8221; Have a specific answer, not a generic &#8220;I&#8217;d communicate earlier.&#8221; Generics signal you haven&#8217;t actually processed the experience.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Describe a situation where you had to influence others without formal authority<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>This tests the &#8220;challenging the status quo&#8221; trait and collaborative mindset together. The answer should describe a specific disagreement or inertia you encountered, the data or reasoning you used to make your case, and how you got others to move without being their manager. &#8220;I made a spreadsheet comparing the two approaches and shared it in the team channel&#8221; is more credible than &#8220;I scheduled a meeting to align everyone.&#8221;<\/p>\n<p>Reported in multiple 2024-2025 behavioral write-ups. Interviewers specifically want to see that influence came from substance, not social pressure. Candidates who describe &#8220;building consensus&#8221; without describing the content of their argument tend to get a weak signal here.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Tell me about a time you failed. What happened and what did you learn?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Google specifically does not want polished-failure stories where everything turned out fine. They want to see intellectual honesty: something that actually went wrong, your role in it, and a concrete change you made as a result. &#8220;We shipped a race condition to prod that caused 2 hours of downtime. I had reviewed the code but missed the concurrency assumption. After that I added a specific concurrency checklist to our PR review template&#8221; is the kind of specificity that scores well.<\/p>\n<p>Interviewers follow up by asking whether the structural change you made actually worked. If you don&#8217;t know, say so. &#8220;I don&#8217;t have data on whether the checklist prevented similar bugs after I left the team&#8221; is a better answer than claiming impact you can&#8217;t verify.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Give an example of when you disagreed with a senior engineer&#039;s technical decision. How did you handle it?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>The answer structure that works: name the specific technical disagreement (not &#8220;an architectural decision&#8221; but &#8220;whether to use a message queue or direct RPC calls for inter-service communication&#8221;), describe what evidence you brought to the conversation, state what the outcome was, and reflect on whether the decision was correct in hindsight. Candidates who defer entirely to seniority signal low agency. Candidates who claim they always win disagreements signal low self-awareness.<\/p>\n<p>One candidate who went through a 2025 Google L4 loop described spending 20 minutes on this single question. The interviewer kept asking &#8220;and then what?&#8221; until they&#8217;d reconstructed the entire technical debate, not just the surface conflict. Prepare the technical substance, not just the interpersonal resolution.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Tell me about a time you had to make a decision with incomplete information<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Google values bias toward action and comfort with ambiguity. The answer should show that you identified what you did and didn&#8217;t know, took the smallest action that would reduce your uncertainty (an experiment, a quick prototype, a user research session with three people), and committed to a path with an explicit trigger to revisit. Answers that describe endless data gathering before any decision signal analysis paralysis.<\/p>\n<p>The follow-up is usually &#8220;how did the decision turn out?&#8221; Have the honest answer. If it turned out badly, explain what signal you got and how quickly you caught it. Speed of feedback loops is part of what Google is evaluating here.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Tell me about a time you received difficult feedback. How did you respond?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>This maps directly to the &#8220;valuing feedback&#8221; trait. The strongest answers name the feedback close to verbatim (&#8220;my tech lead told me my code reviews were blocking the team because I was too slow&#8221;), describe the actual internal reaction honestly, including if it stung at first, and then describe one specific behavior that changed afterward, with some way to check whether it stuck.<\/p>\n<p>Interviewers push on whether you actually changed, not whether you nodded along in the moment. &#8220;I agreed with the feedback and thanked them&#8221; without a described change afterward reads, in the words of one 2025 candidate account, &#8220;like you&#8217;re describing a conversation, not an outcome.&#8221;<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Describe a time the requirements for a project changed significantly after you had already started building<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>This is a distinct comfort-with-ambiguity prompt from the incomplete-information question above; it&#8217;s specifically about a plan shifting mid-flight rather than starting from a blank slate. Strong answers quantify how much rework the change actually cost, whether any earlier design decision happened to absorb part of the change for free, and what you&#8217;d design differently next time to make future pivots cheaper.<\/p>\n<p>Reported from a 2025 Googleyness round transcript shared on Blind. The candidate noted a pointed follow-up: &#8220;was the requirement change avoidable?&#8221; Sometimes it wasn&#8217;t. Saying so, instead of forcing a lesson-learned narrative onto something genuinely out of your control, is a fine answer.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Tell me about a time you had to push back on a request from a stakeholder or from leadership<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Googleyness<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Distinct from disagreeing with a senior engineer&#8217;s technical call, this one tests whether you can say no upward without becoming obstinate or simply complying. Strong answers describe the specific reasoning you brought, what alternative you offered instead of a flat no, and the actual outcome, including cases where you pushed and still lost the argument.<\/p>\n<p>Reported from 2025 candidate accounts describing this as one of the harder Googleyness questions to answer honestly. Interviewers reportedly rate &#8220;I raised the concern, was overruled, and executed anyway without carrying resentment into the work&#8221; as a legitimate and even preferred outcome. Compliance without ever raising the concern in the first place is the answer that scores lowest here, worse than pushing back and losing.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-dsec iq-dsec--hard\"><div class=\"iq-dsec__row\"><h2 class=\"iq-dsec__h\" id=\"hard\"><span class=\"iq-dsec__dot\" aria-hidden=\"true\"><\/span>Hard questions<\/h2><span class=\"iq-dsec__n\">10<\/span><\/div><div class=\"iq-dsec__bar\" aria-hidden=\"true\"><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Trapping rain water<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Two Pointers<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Two-pointer approach: maintain a left and right pointer starting at each end, along with the current max height seen from each side. At each step, move the pointer with the smaller max height inward, adding the difference between that pointer&#8217;s height and the current max to the trapped water total. O(n) time, O(1) space.<\/p>\n<p>Reported from onsite rounds in 2024 and 2025. The brute-force approach (precompute left-max and right-max arrays) is correct but interviewers expect you to optimize to O(1) space. One candidate reported being asked &#8220;what if the input is a 2D elevation map instead of a 1D array?&#8221; after solving the 1D version, which requires a BFS\/priority-queue approach.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\ndef trap(height: list[int]) -&gt; int:\n\n    left, right = 0, len(height) \u2013 1\n\n    left_max = right_max = 0\n\n    water = 0\n\n    while left &lt; right:\n\n        if height[left] &lt; height[right]:\n\n            if height[left] &gt;= left_max:\n\n                left_max = height[left]\n\n            else:\n\n                water += left_max \u2013 height[left]\n\n            left += 1\n\n        else:\n\n            if height[right] &gt;= right_max:\n\n                right_max = height[right]\n\n            else:\n\n                water += right_max \u2013 height[right]\n\n            right -= 1\n\n    return water\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Find the minimum window substring of s that contains every character of t<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Sliding Window<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Two pointers over s, plus a frequency count of the characters needed from t. Expand the right pointer, decrementing a &#8220;still needed&#8221; counter each time a required character is seen enough times. Once every character requirement is satisfied, shrink the left pointer as far as possible while the window stays valid, recording the smallest valid window found. O(n + m) time.<\/p>\n<p>Reported from a 2025 onsite as the direct escalation after the longest-substring-without-repeating-characters warm-up earlier in this page, candidates who treat it as an unrelated new problem lose time re-deriving the sliding window mechanics from scratch instead of adapting what they already built. Google interviewers reportedly watch for that specific transition.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\nfrom collections import Counter\ndef min_window(s: str, t: str) -&gt; str:\n\n    if not t or not s:\n\n        return \u201c\u201d\n\n    need = Counter(t)\n\n    missing = len(t)\n\n    left = start = end = 0\n\n    for right, char in enumerate(s, 1):\n\n        if need[char] &gt; 0:\n\n            missing -= 1\n\n        need[char] -= 1\n\n        if missing == 0:\n\n            while left &lt; right and need[s[left]] &lt; 0:\n\n                need[s[left]] += 1\n\n                left += 1\n\n            if end == 0 or right \u2013 left &lt; end \u2013 start:\n\n                start, end = left, right\n\n    return s[start:end]\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Find the length of the longest increasing subsequence in an array<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Dynamic Programming<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>The O(n^2) version is straightforward: dp[i] holds the longest increasing subsequence ending at index i, computed by checking every earlier index j where nums[j] < nums&#091;i&#093;. The O(n log n) version Google wants as a follow-up maintains a separate array of the smallest possible tail value for each subsequence length seen so far, and uses binary search to find where each new number belongs in that array.<\/p>\n<p>Reported from a 2025 L4 onsite. One candidate&#8217;s write-up described the interviewer accepting the O(n^2) solution, then asking, without any other prompt, &#8220;can you do this in O(n log n)?&#8221; The binary-search-on-tails trick isn&#8217;t something most engineers derive live under pressure; it&#8217;s worth having memorized cold rather than reasoned out from first principles in the room.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\nfrom bisect import bisect_left\ndef length_of_lis(nums: list[int]) -&gt; int:\n\n    tails = []\n\n    for num in nums:\n\n        i = bisect_left(tails, num)\n\n        if i == len(tails):\n\n            tails.append(num)\n\n        else:\n\n            tails[i] = num\n\n    return len(tails)\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Compute the edit distance (Levenshtein distance) between two strings<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Dynamic Programming<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>2D DP table where dp[i][j] is the minimum number of insertions, deletions, or substitutions needed to turn the first i characters of word1 into the first j characters of word2. If the current characters match, dp[i][j] = dp[i-1][j-1]. If they don&#8217;t, dp[i][j] = 1 + min of the insert, delete, and substitute cases.<\/p>\n<p>Reported from a 2024 L4 onsite and flagged in candidate prep guides as a genuine hard problem rather than a medium with escalating constraints. The standard follow-up: reduce the space from O(m*n) to O(min(m,n)) by only keeping two rows of the table in memory at once, since each row only depends on the row directly above it.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\ndef min_distance(word1: str, word2: str) -&gt; int:\n\n    m, n = len(word1), len(word2)\n\n    dp = [[0] * (n + 1) for _ in range(m + 1)]\n\n    for i in range(m + 1):\n\n        dp[i][0] = i\n\n    for j in range(n + 1):\n\n        dp[0][j] = j\n\n    for i in range(1, m + 1):\n\n        for j in range(1, n + 1):\n\n            if word1[i \u2013 1] == word2[j \u2013 1]:\n\n                dp[i][j] = dp[i \u2013 1][j \u2013 1]\n\n            else:\n\n                dp[i][j] = 1 + min(dp[i \u2013 1][j], dp[i][j \u2013 1], dp[i \u2013 1][j \u2013 1])\n\n    return dp[m][n]\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Find the median of two sorted arrays in O(log n)<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Binary Search<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Binary search on the smaller array to find the correct partition. For each candidate partition, check if the max of the left side of both arrays is less than or equal to the min of the right side of both arrays. Adjust the partition left or right based on which condition is violated. Handles odd and even combined lengths differently.<\/p>\n<p>Reported from a 2024 L4 onsite and listed in multiple candidate prep guides as a &#8220;classic Google hard.&#8221; The key insight to articulate: you&#8217;re not searching for a value, you&#8217;re searching for a partition point. Interviewers at Google want the O(log n) solution specifically; the O(n) merge approach is accepted as a starting point only.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\ndef find_median_sorted_arrays(nums1: list[int], nums2: list[int]) -&gt; float:\n\n    if len(nums1) &gt; len(nums2):\n\n        nums1, nums2 = nums2, nums1\n\n    m, n = len(nums1), len(nums2)\n\n    lo, hi = 0, m\n\n    while lo &lt;= hi:\n\n        i = (lo + hi) \/\/ 2\n\n        j = (m + n + 1) \/\/ 2 \u2013 i\n\n        max_left1 = float(\u2018-inf\u2019) if i == 0 else nums1[i \u2013 1]\n\n        min_right1 = float(\u2018inf\u2019) if i == m else nums1[i]\n\n        max_left2 = float(\u2018-inf\u2019) if j == 0 else nums2[j \u2013 1]\n\n        min_right2 = float(\u2018inf\u2019) if j == n else nums2[j]\n\n        if max_left1 &lt;= min_right2 and max_left2 &lt;= min_right1:\n\n            if (m + n) % 2 == 1:\n\n                return float(max(max_left1, max_left2))\n\n            return (max(max_left1, max_left2) + min(min_right1, min_right2)) \/ 2.0\n\n        elif max_left1 &gt; min_right2:\n\n            hi = i \u2013 1\n\n        else:\n\n            lo = i + 1\n\n    return 0.0\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Count range sum: count pairs (i, j) where the range sum lies in [lower, upper]<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Divide and Conquer<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Use prefix sums and a modified merge sort. During the merge step, for each element in the right half, count how many prefix sums in the left half fall within [prefix[j] &#8211; upper, prefix[j] &#8211; lower] using two pointers. This gives O(n log n) total. Brute force is O(n^2) and explicitly rejected at Google.<\/p>\n<p>Reported from a 2024 L4 onsite. This is a legitimate hard problem, not just a medium with a follow-up. Interviewers use it specifically because it requires a non-obvious connection between prefix sums and merge sort. Candidates who recognize the pattern from prior exposure do significantly better than those who derive it fresh.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Serialize a binary tree to a string and deserialize it back<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Trees<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Preorder DFS for serialization, writing each node&#8217;s value and using an explicit marker (commonly &#8220;#&#8221; or &#8220;null&#8221;) for missing children, joined with a delimiter. Deserialization reads the same token stream in order and rebuilds the tree recursively, consuming one token per call and trusting that the preorder-with-null-markers format is unambiguous by construction.<\/p>\n<p>Reported from a 2025 onsite as one of the harder tree problems in current rotation. What makes it a real hard rather than a dressed-up medium: the interviewer is evaluating whether you pick a traversal order that&#8217;s actually reversible before you start typing, not just whether you can write a tree traversal. Candidates who start coding before deciding how null children get represented tend to rewrite half their solution partway through.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Find the length of the shortest transformation sequence from one word to another, changing one letter at a time through valid dictionary words<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">BFS \/ Graphs<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>BFS over an implicit graph where each word is a node, and two words are connected if they differ by exactly one letter. Starting from the source word, at every position in the current word try all 26 possible letter substitutions, check whether the result is in the word set, and if so mark it visited and add it to the next BFS layer. The first time the target word is reached, the current BFS depth is the answer.<\/p>\n<p>Reported in at least two 2025 onsite write-ups as, in one candidate&#8217;s words, &#8220;Google&#8217;s favorite disguised BFS problem.&#8221; The graph is never handed to you, you have to recognize that a shortest-path problem is hiding inside a string transformation and construct the adjacency on the fly. That recognition step, more than the BFS mechanics itself, is what the interviewer is grading.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\nfrom collections import deque\n\nimport string\ndef ladder_length(begin_word: str, end_word: str, word_list: list[str]) -&gt; int:\n\n    words = set(word_list)\n\n    if end_word not in words:\n\n        return 0\n\n    queue = deque([(begin_word, 1)])\n\n    while queue:\n\n        word, steps = queue.popleft()\n\n        if word == end_word:\n\n            return steps\n\n        for i in range(len(word)):\n\n            for c in string.ascii_lowercase:\n\n                candidate = word[:i] + c + word[i + 1:]\n\n                if candidate in words:\n\n                    words.remove(candidate)\n\n                    queue.append((candidate, steps + 1))\n\n    return 0\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Merge k sorted linked lists into one sorted list<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Heap<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Min-heap holding the current head node from each of the k lists, keyed by node value. Pop the smallest, append it to the result list, and if that node has a next node, push it onto the heap. Continue until the heap is empty. Total time is O(N log k), where N is the combined number of nodes across all lists.<\/p>\n<p>Reported from a 2024 L4 onsite and named alongside count range sum earlier on this page as one of the two problems candidates specifically described as &#8220;actually hard, not a medium with follow-ups.&#8221; The naive approaches, merging lists two at a time or dumping every node into one list and sorting, both get pushed on immediately since neither reaches O(N log k).<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\nimport heapq\ndef merge_k_lists(lists):\n\n    heap = []\n\n    for i, node in enumerate(lists):\n\n        if node:\n\n            heapq.heappush(heap, (node.val, i, node))\n\n    dummy = tail = ListNode()\n\n    while heap:\n\n        val, i, node = heapq.heappop(heap)\n\n        tail.next = node\n\n        tail = tail.next\n\n        if node.next:\n\n            heapq.heappush(heap, (node.next.val, i, node.next))\n\n    return dummy.next\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Design Google Search autocomplete (search-as-you-type suggestions)<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">System Design<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Two sub-problems: offline aggregation of query frequencies (MapReduce over search logs, updated every hour or day), and online serving of top-k completions for a prefix. For serving, a trie with top-k completions cached at each node works but doesn&#8217;t scale to billions of queries. In practice, the prefix is hashed to a serving shard that holds a compact prefix tree. Discuss staleness tolerance (hourly vs. daily updates), personalization (user history re-ranks suggestions), and the different latency requirements for each character typed (under 100ms to feel instant).<\/p>\n<p>This problem comes up at both L4 and L5 levels. At L4, interviewers are mostly evaluating data structure selection and trade-off reasoning. At L5, they push on the distributed sharding strategy and consistency model. Reported from a 2025 onsite where the candidate described it as &#8220;a trie question dressed up as a system design.&#8221;<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-dsec iq-dsec--scenario\"><div class=\"iq-dsec__row\"><h2 class=\"iq-dsec__h\" id=\"scenario\"><span class=\"iq-dsec__dot\" aria-hidden=\"true\"><\/span>Real-time scenario questions<\/h2><span class=\"iq-dsec__n\">4<\/span><\/div><div class=\"iq-dsec__bar\" aria-hidden=\"true\"><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Design a URL shortener<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">System Design<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Key components: a hash function to generate short codes (base62 encoding of an auto-incremented ID works better than pure hashing for collision avoidance), a key-value store for the mapping (Redis for hot paths, a relational DB for durability), and a redirect service. Discuss read vs. write ratio (reads dominate heavily), TTL for expiring links, custom alias support, and analytics (what to count, where to store counts without making the redirect path slow).<\/p>\n<p>One of the most consistently reported design problems at Google L4 and L5. Google interviewers want the trade-off discussion, not just the architecture diagram. &#8220;Why base62 over MD5?&#8221; and &#8220;how do you handle hash collisions?&#8221; are expected follow-ups. Reported from multiple candidate write-ups covering 2024-2025 onsites.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Design a rate limiter for an API gateway<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">System Design<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Token bucket and sliding window log are the two algorithms worth knowing cold. Token bucket is simpler and works well for bursty traffic; sliding window log is more accurate but higher memory cost. For a distributed rate limiter, the counter must live in a shared store (Redis with atomic increment and TTL). Discuss consistency trade-offs: a local in-process counter is fastest but allows rate-limit bypass across instances; centralized Redis is accurate but adds a network round-trip to every request.<\/p>\n<p>Reported from L4 onsites in 2025 and confirmed as a standard Google system design problem across multiple preparation guides. The interviewer specifically wants to hear you discuss the distributed case, not just the single-server version.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Design an object-oriented parking lot system<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">System Design<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Model the domain with classes: a ParkingLot containing multiple Levels, each Level containing Spots sized for different vehicle types, a Vehicle hierarchy, and a Ticket issued on entry that gets reconciled against a pricing rule on exit. A strategy pattern for spot assignment (nearest available spot, or size-matched spot) keeps the allocation rule swappable without touching the rest of the system.<\/p>\n<p>Reported from a handful of 2024-2025 phone screens as an alternative to a pure algorithm question, more common on teams building internal tooling rather than consumer-facing products. Interviewers care about where state lives and how the classes talk to each other, not the diagram itself, one candidate reported being asked &#8220;what happens if two cars arrive at the exact same instant for the last spot?&#8221; specifically to see how far the class boundaries had been thought through.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Design a distributed key-value cache, similar to Memcached<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">System Design<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Consistent hashing is the core decision: it shards keys across nodes so that adding or removing a single node only reshuffles a small fraction of the total keys, instead of remapping everything the way a naive modulo-based hash would. Beyond that, discuss per-node LRU eviction, a replication factor for availability when a node fails, and whether writes go through the cache synchronously (write-through) or get flushed later (write-behind), depending on how much staleness the system can tolerate.<\/p>\n<p>Reported from L4-adjacent design conversations in 2025. Interviewers reportedly treat &#8220;consistent hashing&#8221; as a named concept you either bring up unprompted or don&#8217;t; candidates who describe the same idea in vaguer terms (&#8220;we spread the keys across servers evenly&#8221;) get a noticeably weaker signal for the same underlying answer.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-callout iq-callout--insight not-prose\"><div class=\"iq-callout__title\">What we&#039;ve seen across Google L4 loops<\/div><div class=\"iq-callout__body\"><\/p>\n<p>Across mock interview sessions on LastRoundAI with candidates preparing for Google L4, one failure mode appears more consistently than any other: candidates solve the base problem correctly and then freeze when the follow-up question arrives. They treat the follow-up as a new problem from scratch rather than as a modification of their existing solution.<\/p>\n<p>Google interviewers are specifically assessing this. The follow-up is not a bonus question; it is part of the evaluation. Candidates who say &#8220;give me a moment to think about this&#8221; and then reason out loud, connecting the follow-up constraint back to their existing data structure choice, score significantly higher than candidates who either answer immediately (and often incorrectly) or go quiet.<\/p>\n<p>The second pattern: in the Googleyness round, candidates who prepare stories with specific technical context outperform those with generic behavioral answers. &#8220;I disagreed with using a relational DB for our recommendation engine at 10M QPS&#8221; is evaluated differently from &#8220;I disagreed with my team about a technical choice.&#8221; Same story structure, very different signal.<\/p>\n<p><\/div><\/div>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does Google ask system design questions at L4?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Not as a standard round. System design is formally part of the L5 and above evaluation at Google. Most L4 onsites include two to three coding rounds plus one Googleyness round. Some teams include a lighter design conversation in the hiring manager call. Confirm your specific loop format with your recruiter.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How long does the Google L4 interview process take?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Most candidates report six to ten weeks from application to verbal offer. Referrals often move faster, sometimes four to five weeks. The hiring committee review after the onsite typically adds one to two weeks and is the step with the most timing variance.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What coding language should I use for Google interviews?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Python is the most commonly used and is generally preferred for its readability in a shared Google Doc. Java and C++ are also accepted. There is no syntax highlighting or autocomplete in the Doc, so using a language you can write cleanly from memory matters more than usual.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How difficult are Google's coding problems compared to LeetCode?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Phone screens are medium difficulty. Onsite coding rounds run medium to hard, and follow-up constraints often push a medium problem into hard territory. A practical benchmark: if you can solve 70% of LeetCode mediums and 30% of hards in 30 minutes with a clean explanation, you are roughly at the bar.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is the Google Hiring Assessment and can I fail it?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The GHA is a 30 to 45 minute personality-and-culture screen with about 50 Likert-scale questions. It is not a coding test. Google uses it as a filter before the recruiter call in some pipelines. Answer honestly and consistently; large inconsistencies between related questions can screen you out before your resume reaches a human reviewer.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Is Google interviewing in-person or virtually in 2026?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Both. As of 2025, Google requires at least one in-person round for candidates near a Google office, partly due to AI-assisted cheating concerns. Remote candidates can still complete fully virtual loops. The coding environment is identical either way: a shared Google Doc with no editor tooling.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What happens after the Google onsite? How does the hiring committee decide?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Each interviewer submits a written packet, not just a score, and a hiring committee that never interviewed you reviews the full set of packets. If approved, most L4 candidates then go through a separate Team Match process to be paired with a specific team, which can take two to three additional weeks.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I reapply if I get rejected in the Google L4 loop?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, after a cooldown period. The most commonly reported window is 12 months after a full-loop rejection, sometimes shorter if you were rejected earlier in the process. The exact window is not published and varies by req and recruiter.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<div class=\"iq-related not-prose\"><div class=\"iq-related__title\">Related interview guides<\/div><div class=\"iq-related__grid\"><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/meta-e5\"><span class=\"iq-rel__t\">Meta E5 Interview Questions (2026): What They Actually Ask<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/amazon-sde-2\"><span class=\"iq-rel__t\">Amazon SDE-2 Interview Questions (2026): What They Actually Ask<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/microsoft-sde\"><span class=\"iq-rel__t\">Microsoft SDE-2 Interview Questions (2026): What They Actually Ask<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/apple\"><span class=\"iq-rel__t\">Apple Software Engineer Interview Questions (2026): What They Actually Ask<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/system-design\"><span class=\"iq-rel__t\">System Design Interview Questions (2026): Must-Know Q&#038;A<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><\/div><\/div>\n<p><div class=\"iq-sources not-prose\"><div class=\"iq-sources__title\">Sources &amp; further reading<\/div><ul class=\"iq-sources__list\"><li><a href=\"https:\/\/www.hellointerview.com\/guides\/google\/l4\" target=\"_blank\" rel=\"nofollow noopener\">Hello Interview Google L4 Guide<\/a><\/li><li><a href=\"https:\/\/www.onsites.fyi\/blog\/article\/google-L4-software-engineer-interview-questions\" target=\"_blank\" rel=\"nofollow noopener\">Onsites.fyi Google L4 Guide<\/a><\/li><li><a href=\"https:\/\/jatinnarula.substack.com\/p\/google-interview-experience-l4-software\" target=\"_blank\" rel=\"nofollow noopener\">Google L4 Interview Experience (Jatin Narula)<\/a><\/li><li><a href=\"https:\/\/interviewpilot.dev\/interview-experiences\/google\" target=\"_blank\" rel=\"nofollow noopener\">InterviewPilot Google L4\/L5 Experiences<\/a><\/li><li><a href=\"https:\/\/www.glassdoor.com\/Interview\/Google-Software-Engineer-Interview-Questions-EI_IE9079.0,6_KO7,24.htm\" target=\"_blank\" rel=\"nofollow noopener\">Glassdoor Google Software Engineer Interviews<\/a><\/li><li><a href=\"https:\/\/igotanoffer.com\/blogs\/tech\/google-behavioral-interview\" target=\"_blank\" rel=\"nofollow noopener\">IGotAnOffer Google Behavioral Guide<\/a><\/li><li><a href=\"https:\/\/jobright.ai\/blog\/google-technical-interview-questions-complete-guide-2026\/\" target=\"_blank\" rel=\"nofollow noopener\">Jobright Google Technical Interview Guide 2026<\/a><\/li><\/ul><\/div><br \/>\n<\/content><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A candidate who went through the Google L4 loop in late 2024 described the coding round this way: &#8220;The problem itself was a medium. But then they just kept going. Four follow-up questions. Each one harder than the last.&#8221; That pattern, a reasonable starting question followed by a sequence of constraints that compounds difficulty, shows&#8230;<\/p>\n","protected":false},"author":6,"featured_media":1733,"comment_status":"open","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"tags":[],"class_list":["post-958","iq","type-iq","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Google L4 Interview Questions (2026) | LastRoundAI<\/title>\n<meta name=\"description\" content=\"Real Google L4 SWE interview questions for 2026: coding algorithms, Googleyness behavioral, system design, and process. Based on verified candidate reports from 2024-2026.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/lastroundai.com\/interview-questions\/google-l4\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Google L4 Interview Questions (2026) | LastRoundAI\" \/>\n<meta property=\"og:description\" content=\"Real Google L4 SWE interview questions for 2026: coding algorithms, Googleyness behavioral, system design, and process. Based on verified candidate reports from 2024-2026.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/lastroundai.com\/interview-questions\/google-l4\" \/>\n<meta property=\"og:site_name\" content=\"LastRound AI\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-19T05:24:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/07\/iq-google-l4-og.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/google-l4\",\"url\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/google-l4\",\"name\":\"Google L4 Interview Questions (2026) | LastRoundAI\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/google-l4#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/google-l4#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/iq-google-l4-og.png\",\"datePublished\":\"2026-06-24T17:33:56+00:00\",\"dateModified\":\"2026-07-19T05:24:09+00:00\",\"description\":\"Real Google L4 SWE interview questions for 2026: coding algorithms, Googleyness behavioral, system design, and process. Based on verified candidate reports from 2024-2026.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/google-l4#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/google-l4\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/google-l4#primaryimage\",\"url\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/iq-google-l4-og.png\",\"contentUrl\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/iq-google-l4-og.png\",\"width\":1200,\"height\":630,\"caption\":\"Google L4 interview questions \u2014 LastRoundAI\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/google-l4#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/lastroundai.com\\\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Interview Questions\",\"item\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Google L4 Interview Questions (2026): What They Actually Ask\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/\",\"name\":\"LastRound AI\",\"description\":\"Interview Assistant prep, tech careers and AI tools\",\"publisher\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#organization\",\"name\":\"LastRound AI\",\"url\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/lastroundai-transprant-logo-optimized-BxEo2Wtq.png\",\"contentUrl\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/lastroundai-transprant-logo-optimized-BxEo2Wtq.png\",\"width\":400,\"height\":400,\"caption\":\"LastRound AI\"},\"image\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Google L4 Interview Questions (2026) | LastRoundAI","description":"Real Google L4 SWE interview questions for 2026: coding algorithms, Googleyness behavioral, system design, and process. Based on verified candidate reports from 2024-2026.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/lastroundai.com\/interview-questions\/google-l4","og_locale":"en_US","og_type":"article","og_title":"Google L4 Interview Questions (2026) | LastRoundAI","og_description":"Real Google L4 SWE interview questions for 2026: coding algorithms, Googleyness behavioral, system design, and process. Based on verified candidate reports from 2024-2026.","og_url":"https:\/\/lastroundai.com\/interview-questions\/google-l4","og_site_name":"LastRound AI","article_modified_time":"2026-07-19T05:24:09+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/07\/iq-google-l4-og.png","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/lastroundai.com\/interview-questions\/google-l4","url":"https:\/\/lastroundai.com\/interview-questions\/google-l4","name":"Google L4 Interview Questions (2026) | LastRoundAI","isPartOf":{"@id":"https:\/\/lastroundai.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/lastroundai.com\/interview-questions\/google-l4#primaryimage"},"image":{"@id":"https:\/\/lastroundai.com\/interview-questions\/google-l4#primaryimage"},"thumbnailUrl":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/07\/iq-google-l4-og.png","datePublished":"2026-06-24T17:33:56+00:00","dateModified":"2026-07-19T05:24:09+00:00","description":"Real Google L4 SWE interview questions for 2026: coding algorithms, Googleyness behavioral, system design, and process. Based on verified candidate reports from 2024-2026.","breadcrumb":{"@id":"https:\/\/lastroundai.com\/interview-questions\/google-l4#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/lastroundai.com\/interview-questions\/google-l4"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/lastroundai.com\/interview-questions\/google-l4#primaryimage","url":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/07\/iq-google-l4-og.png","contentUrl":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/07\/iq-google-l4-og.png","width":1200,"height":630,"caption":"Google L4 interview questions \u2014 LastRoundAI"},{"@type":"BreadcrumbList","@id":"https:\/\/lastroundai.com\/interview-questions\/google-l4#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/lastroundai.com\/blog"},{"@type":"ListItem","position":2,"name":"Interview Questions","item":"https:\/\/lastroundai.com\/interview-questions"},{"@type":"ListItem","position":3,"name":"Google L4 Interview Questions (2026): What They Actually Ask"}]},{"@type":"WebSite","@id":"https:\/\/lastroundai.com\/blog\/#website","url":"https:\/\/lastroundai.com\/blog\/","name":"LastRound AI","description":"Interview Assistant prep, tech careers and AI tools","publisher":{"@id":"https:\/\/lastroundai.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/lastroundai.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/lastroundai.com\/blog\/#organization","name":"LastRound AI","url":"https:\/\/lastroundai.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/lastroundai.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/06\/lastroundai-transprant-logo-optimized-BxEo2Wtq.png","contentUrl":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/06\/lastroundai-transprant-logo-optimized-BxEo2Wtq.png","width":400,"height":400,"caption":"LastRound AI"},"image":{"@id":"https:\/\/lastroundai.com\/blog\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/iq\/958","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/iq"}],"about":[{"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/types\/iq"}],"author":[{"embeddable":true,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/comments?post=958"}],"version-history":[{"count":4,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/iq\/958\/revisions"}],"predecessor-version":[{"id":1835,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/iq\/958\/revisions\/1835"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/media\/1733"}],"wp:attachment":[{"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/media?parent=958"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/tags?post=958"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}