Apple Software Engineer Interview Experience — Six Onsite Rounds That Felt Like Six Different Companies

Apple·Software Engineer·Jun 2026
Onsitemedium

Six rounds, written for people as confused as I was.

One thing I only understood after the whole process: this company hires by team, so each team sets its own bar and writes its own questions — which means whatever interview experience you find here for this company might be less useful than you'd hope. Over my six rounds, the six interviewers were different enough in style that it felt like six different companies. Some spent the entire round picking apart pointer details, others just wanted to talk about a project from three years ago on my resume.

Then there's the secrecy. Even now, I still don't fully know what this team actually works on. When I asked interviewers, most of the answers amounted to "you'll find out once you're in." So in what follows, I'm skipping anything about the team or the product and just writing down the questions. As is customary here, questions get coded names instead of clean numbers — I'm decoding them below.

Round 1

The first interviewer started writing the question immediately — no self-intro, and he didn't ask me to introduce myself either.

The problem was 138: copy a linked list with random pointers.

Hash map from old node to new node, two passes — first pass creates the nodes, second pass wires up the pointers. After I finished he asked, "can you get the space down to O(1)?"

That follow-up was the real point of this round. The approach is in-place interleaving: first insert a copy node after every original node, turning A into A-A'-B-B'-C-C'; then use that structure to set the random pointers — A'.random is A.random.next; finally split the two chains apart.

He had me walk through the third step — the splitting — separately, since that's the easiest place to get wrong: while splitting, you have to make sure the original list also comes back fully restored, with no dangling pointers left. After I finished he pointed at the last node and asked, "what's next here?" I said you have to explicitly null it out, otherwise the last original node is still pointing at its copy. If you don't handle that on purpose, it'll still pass, but the structure is already broken.

My sense is this round was entirely about pointer discipline, not algorithms.

Round 2

The problem was 426: convert a binary search tree in place into a sorted, circular doubly linked list. Use the left pointer as prev and the right pointer as next.

In-order traversal, keeping a running prev pointer, and every time you visit a node you link prev and the current node together in both directions. After the traversal, connect the head and tail into a circle.

Before I started coding, I explained upfront what the "first" and "last" member variables were for. At that point the interviewer said, "good — a lot of people only realize halfway through that they need to remember the head node."

There were two follow-ups:
One — what if the tree is empty? You need to return null directly there, without falling through to the step that closes the circle, or you'll get a null pointer.
Two — can you do it iteratively? I said yes, using an explicit stack to simulate the in-order traversal, with the same logic for maintaining prev. He had me sketch the skeleton, but didn't ask me to finish it.

This round felt like the same flavor as round 1 — both pointer problems, both picking apart restoration and edge cases. I started to suspect this team's actual codebase does a lot of pointer manipulation.

Round 3

The problem was 863: given a binary tree, a target node, and a distance K, return all nodes exactly K away from the target.

The key wrinkle is that the tree only has downward pointers, but distance is bidirectional, so you first have to convert the tree into a graph. My approach: one DFS pass to record each node's parent, then BFS from the target node, K levels deep, with a visited set to avoid backtracking.

After I finished, the interviewer asked a few questions:
"What if K is bigger than the height of the tree?" — return an empty list; the BFS naturally runs out of nodes.
"What are you storing in visited?" — I initially said node values, and he immediately said "values can repeat." I switched to storing the node references themselves. That's something I should have caught on my own.
"What if you need all nodes at distance less than or equal to K?" — just collect the results from every BFS level, not only level K.
"Can you do it without building parent pointers?" — I said you can compute it directly during the DFS: if the current subtree contains the target, propagate the distance upward through the return value, then look for the matching depth in the other subtree. That version is more space-efficient but harder to get right — I only talked through the idea, didn't write it.

Round 4

This round clearly wasn't pulled from a problem site — it felt more like something they'd actually run into at work.

The question: write a function that determines whether two dates are exactly one month apart, within one month, or more than a month apart.

I opened with a string of questions: what's the input date format, do we need to handle time zones, how do we handle leap years, how do we handle crossing a year boundary, and does "one month" mean a calendar month or thirty days.

The interviewer's answer surprised me a little — he said don't worry about time zones or leap years, "one month" means a calendar month, and he didn't care whether Jan 31 to Feb 28 counts as a month apart or not. What he wanted was a simple, clear definition plus a correct implementation.

The rule I landed on: first compute the month difference from year and month, then correct using the day — if the days match it's exactly a month, a smaller day means less than a month, a bigger day means more than a month. Then I coded that rule.

He also asked, "would you use a built-in date library?" I said yes — rolling your own date logic in production code is asking for trouble, unless there's a clear performance or dependency constraint. He said that answer was fine.

What I took from this round: some of the questions here aren't testing algorithms, they're testing whether you can pin down a fuzzy requirement first. If I'd just put my head down and started coding, I probably would've ended up with something I couldn't even explain the rules of.

Round 5 — Design

The problem was designing a wallpaper sync feature: a user changes their wallpaper on one device, and it should sync to their other devices.

I assumed going in this would be a standard distributed systems design, but talking it through, the focus was completely different — almost entirely client-side and system-level.

Things I got asked about:
One: when does the resource get downloaded. Wallpaper files aren't small, so you can't start downloading the moment the user switches. I said you should prefetch — pull it in the background when the device is idle, on Wi-Fi, and charging. He reacted positively to the "charging" condition specifically, saying background tasks like this really do need to respect battery policy.
Two: what happens on a download failure. A few cases: if the network drops you need resumable downloads, so the file needs to be chunked with completed chunks tracked; if the server-side resource changed you need a version number or ETag to detect it; and repeated failures need exponential backoff rather than endless retries.
Three: how is the cache managed. How many images to keep locally, how to evict, and whether the one the user manually set should be pinned and never evicted. I said you need to distinguish between "system-prefetched" and "user-explicitly-chosen," with the latter getting top priority.
Four: sync consistency. What happens if multiple devices change it at the same time. I said last-writer-wins with a timestamp is enough — this scenario doesn't need strong consistency — but the device the user is actually acting on needs to show the change immediately, and a failed sync shouldn't roll back what's already showing locally.
Five: async work and the main thread. He asked directly, "which thread does decoding and rendering happen on?" I said downloading and decoding both have to happen in the background, with the main thread only doing the final commit, otherwise you'll drop frames.

The distributed-systems prep I'd done barely came up in this round — what actually saved me was operating-system and client-side common sense. If you're interviewing with this kind of team, I'd suggest thinking ahead about background task scheduling, battery, cache eviction, and threading models.

Round 6

This one was with someone fairly senior, no coding.

Roughly, the questions were:
Walk me through something you built start to finish, specifically which parts you wrote.
What's the hardest bug you've ever debugged.
Have you ever made a technical decision you later found out was wrong.
How do you work with people who disagree with you.
Why do you want to work here.

He dug deep on the second question — all the way down to what logs I looked at, how I narrowed things down, and why my initial hypothesis was wrong. That's very different from behavioral rounds I've had elsewhere — it felt like he was using a specific debugging story to gauge my actual technical depth, rather than listening to me talk about soft skills.

I answered the last question pretty weakly — I said some generic stuff about caring about the product. Thinking back, I should have been more specific — like why this particular direction, and which part of my own background actually lines up with it.

Some takeaways

One: this company hires by team, so other people's interview experiences are only a reference. Half of my six rounds were pointer problems, but I've also seen people on this forum whose entire loop was distributed systems. So when you're reading someone else's experience, first figure out which kind of team it was for.

Two: your pointer and memory fundamentals need to be solid. For problems like copying a linked list or converting a tree into a linked list, getting a working solution is the baseline — making sure you don't corrupt the original structure or leave a dangling pointer is what they're actually evaluating.

Three: some of the questions are testing requirements clarification, not algorithms. If I hadn't pinned down what "one month" meant before writing that date problem, whatever I wrote would have been very hard to justify.

Four: client-side design questions need separate prep. Background task scheduling, resumable downloads, cache eviction policy, threading models — that's a completely different set of topics from the usual distributed-systems standards.

Five: have one debugging story you can go deep on. I could clearly feel that this round was where they most wanted to judge someone's real level.

Six: the secrecy culture is real. Through the whole process I learned very little about what this team actually does — if that matters to you, I'd push for as much information as you can get wherever the process allows it.

This came out a little scattered, but I hope it's useful for people preparing for the same thing.

Published

Curated and edited by PracHub

Practice the questions from this interview

Discussion

Sign in to join the discussion. The author is notified of every comment.

Loading comments…

Interview at a glance

Company
Apple
Role
Software Engineer
Rounds
Onsite
Difficulty
medium
Interview date
Jun 2026
Questions from this interview
10 questions

Real Apple interview experiences

First-hand reports from Apple candidates — the rounds, the questions they were asked, and how it went.

All 34 Apple interview experiences