We helped write the sequel to "Cracking the Coding Interview". Read 9 chapters for free

Python Interview with a FAANG engineer

Watch someone solve the random pick with weight problem in an interview with a FAANG engineer and see the feedback their interviewer left them. Explore this problem and others in our library of interview replays.

Interview Summary

Problem type

Random Pick with Weight

Interview question

1) You are given a 0-indexed array of positive integers w where w[i] describes the weight of the ith index. You need to implement the function pickIndex(), which randomly picks an index in the range [0, w.length - 1] (inclusive) and returns it. The probability of picking an index i is w[i] / sum(w). For example, if w = [1, 3], the probability of picking index 0 is 1 / (1 + 3) = 0.25 (i.e., 25%), and the probability of picking index 1 is 3 / (1 + 3) = 0.75 (i.e., 75%). 2) Given the root of a binary tree, return the vertical order traversal of its nodes' values. (i.e., from top to bottom, column by column). If two nodes are in the same row and column, the order should be from left to right.

Interview Feedback

Feedback about Admiral Samurai (the interviewee)

Advance this person to the next round?
Thumbs upYes
How were their technical skills?
4/4
How was their problem solving ability?
3/4
What about their communication ability?
4/4
# 03/29/2024: 16:00, Analog Armadillo, ML System Design [Meta Finals] - Excellent vibes, easy to talk to and understand. - Dont mention if you have seen the question, this may ‘raise the bar’ for you. Act oblivious, and run through the question generically, starting simple, detailing the complexities, and then proposing a more efficient approach and run with it. Incorporate cues that show ‘thinking’ - Chose simplicity, I would even advise against writing too many notes except for the complexities. Try and get to code within 3 minutes of proposing solutions, implement the best you have and roll with it. - Expect minimal interruption from your interviewer for your technical interview, it will be very mechanical unfortunately as meta tries to standardize everythin. - Excellent note of binary search as a potential approach you could take. - I am a fun of modulation, but class may make it too complicated. A function should be sufficient for most problems with shared variables at the top namespace. - Excellent code speed overall. I would advise going through all complexities and edge cases ahead of time, then flash out the constraints of the logic while coding. This can help you save time and speed run you through the solution. Always touch on time, space, worst case, best case (These cases are best communicated with examples). Our worst case with bin search is one where the probabilities lean heavily to the end or the begining forcing a ‘full binary search’ - For components that are ‘extensions’, I advise abstracting them behind a function that you assume exists, and preemptively describing the logic. Some interviewers may allow you to skip over the implementation for some of the logic. You may also benefit from curating implementation templates and putting them somewhere close where a side eye can help you review them in case you are asked to implement them. - Good intuitition to run through and example, always bias towards testing your code, but this is where abstracting away helper logic can help. If you ‘assumed a binary search function’ exists, you would have been able to run through it without tracing the values - You should incorporate your invariant in your binary search to simplify thing whenever possible. In this case, most of the logic was in the bin search thus you could have easily captured it and then for your binary search, search for the value in range. - Good logic to leverage a map. Quick note, in python you can even leverage ordered dict to simplify it. - Leverage standard implementation techniques, bfs would be perfect her but dfs also works. BFS would retain the vertical order, precisely per your intuition. - Perfect! You got the BFS bit!!! - Excellent optimization using the min max values given the contiguity guarantee.

Feedback about The Legendary Avenger (the interviewer)

Would you want to work with this person?
Thumbs upYes
How excited would you be to work with them?
4/4
How good were the questions?
4/4
How helpful was your interviewer in guiding you to the solution(s)?
4/4
Thank you very much - you are an excellent interviewer :)

Interview Transcript

The Legendary Avenger: Hello?
Admiral Samurai: Hello?
The Legendary Avenger: Can you hear me? All right, I can hear you well, hope you can hear me.
Admiral Samurai: Yep.
The Legendary Avenger: Awesome. All right. How's your day going?
Admiral Samurai: Good, good, yeah. I am preparing for an interview with Facebook next week. It's a final round interview, but yeah. Want to, you know, trying to break into big tech, have about eight years of experience working at startups, but trying to get over that hurdle to a, you know, a name brand company.
The Legendary Avenger: I hear you count your lucky stars, because you're speaking with an engineer at Meta right now. So I'll give you pretty much the experience as you would have it in the actual interview. So you get that, you get the branding treatment even. I hope that this, this is going to be beneficial for you. Okay.
Admiral Samurai: Feeling very lucky. Yeah, thank you very much.
The Legendary Avenger: For sure. Awesome. Okay, so I'll do this because I don't ran you through the process, but the way meta works. So let me just take a few minutes to first run you through that before we switch into interview mode. But for technical interviews, it's typically about 45 minutes. Right. And they're strict. Like, the thing about meta is I say there, but we are strict. I hate the fact that we are, but it is what it is. So most interviewers you'll meet, in fact, do introductions and discussions at the end. They try to make sure they minimize as much disruption as possible. So it will be, you get in, start coding, or basic intros, two sentences at most a minute or two. You start coding. Now, the second constraint is expect two questions at a minimum. You'll be expected to solve at least two. So it makes self evaluation relatively straightforward. If you're able to get through two, you know you did well enough to pass. If you're able to get through three, you did better than expected. So that's more like, you know, very strong feedback. Right. And then here's the good news. Almost all the questions you'll be asked are only. It could.
Admiral Samurai: Yeah.
The Legendary Avenger: Yep. And so don't practice. In fact, I'll tell you, if you, if you're crunching on prep, don't do anything else. Focus on the leetcode questions. I would say lean in on the easy question. Not easy. The medium questions, they're medium, maybe medium hard, but don't worry too much about hard. You might actually encounter some easy. So the reason why they ask you two is because they expect you to solve two easy to medium level questions in 45 minutes. That's, that's literally what the coding interview is.
Admiral Samurai: Is that true even for the final round? Because I have two coding interviews for the final round, I did the phone screen, and, yeah, it was very much like two medium leetcode problems. They were right there. Also on leetcode.
The Legendary Avenger: Exactly. And that's going to be the same case. So if you stuck to the practice, in fact, just go there, sort it by popularity, and solve them in that order, they're going to ask you pretty much the same questions.
Admiral Samurai: Great, great. Yeah, I've done, like a little over 300 leetcode problems this time, so I'm feeling like, pretty comfortable with it, but, yeah, I want to just make sure.
The Legendary Avenger: Great, exactly. So, yeah, I can confirm it for you. And so by all means, stick to that plan and then you'll be fine.
Admiral Samurai: Okay, great. Yeah, yeah, and yeah, of course. Any feedback from this session, yeah, as.
The Legendary Avenger: We'Ll see, will be helpful. Awesome. Awesome.
Admiral Samurai: Yeah.
The Legendary Avenger: Let's switch into interview mode because I know it's four or three on my side right now in Seattle. Excellent weather today. I'm so happy about it. So we'll switch into interview mode at four, five, let's start coding, and let's try and end at 450. And what we'll do is we'll use the last ten minutes to go through feedback, and I'll give you as candid feedback as I can give. But for that duration, let's simulate an actual interview experience. Hopefully I'm one of the nicer interviewers, but for the most part, let's actually give you an experience exactly as you would experience it in that final interview. Okay?
Admiral Samurai: Yes. Sounds great. Let's do it.
The Legendary Avenger: Cool. All right, so let's, you know, you've given me the basic intro, but just give me like a basic run through in one or two sentences of, you know, what you're looking to do and you know, what, what you've done so far.
Admiral Samurai: Ah. Like about me myself. Yeah.
The Legendary Avenger: Like, assuming it's the interview. So we've started. So. Hey, hello, my name is interviewer. Let's get started.
Admiral Samurai: Yeah, yeah. Hi, nice to meet you. Yeah. My name is Luke, dedicated software engineer, about eight years of experience, most recently working with core services and infrastructure. I'm excited to work at Meta for opportunity to work on services that connect billions of people worldwide. I find that really engaging and inspiring and I'm excited to be here.
The Legendary Avenger: Awesome. Yeah. And I'm Brian, currently working at Meta, working in the AI team. So I'm building tools to help developers be more productive. Hopefully this goes well and you get through okay. Thank you. Okay. With that, feel free to select the language you wanna use, and then you can get started.
Admiral Samurai: Yeah. All you using Python? Let's see here.
The Legendary Avenger: Awesome. All right, cool. And so I'll paste the first question that you're gonna run through it. And so this is the question. Take a minute to read it, and then just get started with it. And then if I have any questions, I'll make sure I ask.
Admiral Samurai: Okay? Yeah.
The Legendary Avenger: All right.
Admiral Samurai: Yeah. Outside of interview mode, I think I familiar with this question.
The Legendary Avenger: Okay.
Admiral Samurai: Back in interview mode, though.
The Legendary Avenger: Okay, so random, random notes. Outside of interview mode, if you've seen the question, don't tell the interviewer. Act as though you've not, and then act slightly confused, you know, like, you know, run through the piece. Yeah. Propose.
Admiral Samurai: Yeah. Curious. Yeah. Don't be honest to too honest. Yeah, yeah, yeah, yeah. I would be, like, curious. Yeah. I mean, you never know.
The Legendary Avenger: There could be a subtlety or they.
Admiral Samurai: Might be looking for something different. I think the key here is. Let's see. Yeah. I don't want to jog my memory too much, but I think I wanted to use some kind of prefix sum. Let's see. Because the key here. So the probability of picking the index is the weight. So for example. Okay, yeah, one and three, we have 25% chance of picking. 170 percent chance of picking three. Yes. So we'd want, like, a sum of the array, and then we would want to the odds of picking that to be the weight of I divided by that sum. And to do that, I think we can think of this as like a lottery system where we pick a random integer in a certain range. That makes it so that the probability is our desired probability. So if I say, like, random randint, I forget the exact python thing. But.
The Legendary Avenger: You don't have to get exact python syntax. I mean, so long as you explain what the function you're using does, I'll define it.
Admiral Samurai: Great. Okay. Yeah. And so I would choose this. Let me try to, actually, I don't think we necessarily need a prefix some, but we want to sort of initialize. And this could be initialized in, like a class or something. But like, initialize. Like, we calculate a sum here. Now, it takes o of n to go through, but once we have that, then we can pretty much in constant time do this selection. And so, like, if I call this num. Let me think. Oh, wait, we might actually want the prefix sum here. Let me try to think about how we'd want. But, yeah, I think we want this sort of ticket, this lottery sort of approach here. So we have the sum. Oh, yes. We want zero to sum, let's say. And let's say this is like, if it's inclusive, we want something like that. Assuming. Pick randomly inclusive. Or let's say if it's inclusive, exclusive. Maybe that would be easier. And then we would. Hmm. We'd want to map that to our prefix sum. So I think, yeah, we do want to use a prefix sum. So in this case, w would equal our prefix sum equal one and then four. And we could calculate this ahead of time if, assuming we want to reuse this. But that's. We could talk about that later. But once we have the prefix sum, then we want to choose the number such that it fits in. If the number is between zero and one, then we map that to one. If the number is between two and four, two. Three or four. Or, wait, one, two or three, then we know that we've chosen the second item.
The Legendary Avenger: All right, so let me just make sure I understand this. So you are going to evaluate the prefix sum as some sort of cumulative calculation. So assuming we had a bigger array. So whatever the result you have here, you carry it over and then you add it to whatever you have that updates the result. And you do that till you have this array. And then from there you pick a random probability between zero and one, and then you map it to sum in the prefix sum. Yeah, the array of prefix sums, right?
Admiral Samurai: Yes, yeah, we'd map it, yeah. We pick randomly between zero and sum minus one, but. Yes, and then we would map that to this prefix sum and mapping. That is an interesting step to. I think we can probably use a binary search to map that in log end time as well. Yeah. And when we map that, it would. Yeah. It's not a simple binary search. We'd want to sort of choose the lesser, like the least greatest value, I think something like that, where the first value that exceeds that, it exceeds in the prefix sum.
The Legendary Avenger: Let me throw a challenge. So say I have 155556. That's basically my array. And so in this case, I'm assuming your prefix sum will be 16, 11, 16. What poll is that? 2022. Right.
Admiral Samurai: I think this is the one, right?
The Legendary Avenger: Oh, yeah, yeah, you're right. Yeah. So one, sorry, type there. So one.
Admiral Samurai: Six.
The Legendary Avenger: So I'm assuming that's. That's how you evaluate this, right?
Admiral Samurai: Yeah.
The Legendary Avenger: Make sure they're mapping together. Is that correct?
Admiral Samurai: Yes. That looks 16.
The Legendary Avenger: I think I missed a five here, but we can remove one five to keep it simple. So in this case, let's say I pick zero point. Let's say five. So in my random. So my random number right there, so my num. Because it's zero and. Oh, it's sum minus one. Right.
Admiral Samurai: Yeah. So I would.
The Legendary Avenger: Okay, that makes sense.
Admiral Samurai: Yeah. So we'd pick an integer between zero and whatever the sum of this is zero to. Yeah. Is it 22? Yeah. Or 21? I would actually choose. We could choose either way.
The Legendary Avenger: All right, so that's actually an interesting question. So python is and exclusive stat. Inclusive. Right. So you say 21. It might, yeah, exactly. Okay, so you start from zero. Yeah, this makes sense. Yeah. So you start from the minimum, you go to the maximum, you pick a random one and then you find. So what are you going to return? So say I say I generate, let's say the value two. Where is two going to fall?
Admiral Samurai: Two is going to fall. Two will fall under index one because it exceeds the value one, but it's under the values six. And that matches with values two through six mapping to this. So that way our probability is lines up. So let's see, index two or index one.
The Legendary Avenger: Yeah, I'm going to explode this a bit. So from what I see. So what's the range for values that can fall? Like, if I wanted to, let's say, select a value that would actually give me index zero, what's the range of values that I'll generate for that?
Admiral Samurai: It can only be one. This would be one. This would be two through six. This will be seven through eleven. This will be twelve through 16. This will be 17 through 2021. No, 22. Yeah.
The Legendary Avenger: I was actually going to say. And this, you know, the reason we are writing this again, back to that point on start, exclusive and inclusive. So in this case you can say it's one, two, two. Right. And then two to six. And then six to eleven because it's going to include two. Yeah. And then eleven to 1616 to 22. Does that make sense?
Admiral Samurai: Yes. Okay.
The Legendary Avenger: And then this can then follow the conditions you said. So range, no range, start to end. So that makes things a lot simpler because you're just using the values that are here. All right, so this is good. This makes sense to me and I think it's actually an optimal solution. So feel free to code it out and let's see how that works.
Admiral Samurai: Yeah.
The Legendary Avenger: So.
Admiral Samurai: There'S a couple things here. Like maybe I could have a class which, like, I mean, I don't want to get too much into the weeds, but I think we would have initialize with the array and that way we would do this o of n operation right up front. And that way we would calculate this prefix sum initially and then after that we can do this pick operation. Oh, this would be weights. Yeah. And pick doesn't need any arguments. So that makes sense. Okay. Yeah. And then I'm going to calculate the prefix sum here. Let's see. Sorry, jumping around here. But. All right, so we've got the prefix sum. Now this is where we do the interesting stuff. So num equals random. Yeah. This to sum. Yeah. And then, now we want to do a binary search. Let's see, j equals. So we have a mid and then val equals or. No, this is prefix sum. Okay. Oh, yeah. I think want like the structure to be something like this. And then if. Hmm. If, if I, so here, the binary search. Yeah. If it's greater than val, answer equals mid, and then I equals equals. There might be logic error, but I want to, like, this is generally the approach we'd have. I have to, I probably want to like walk through this example just to make sure I've got it correct. So we have the following prefix sum, and then let's say we pick a value, one, and our mid, that will be our mid right there in the middle. Here's our I, our j will be at the end here. And then if prefix sum is greater than o or is it equal? No, only if it's greater than that. Then we set the answer equal to the mid, but it's not greater than that. So that means we move j down here. Actually, I think we want this to be, we want to round up instead of down. And so if mid is here, now we can say that the prefix sum. Now the prefix sum is greater. Oh, yeah. Equals one. Oh, I think we want to switch these. I think I missed that. Here we go. Answer is going to. But then, now we set the answer again to one. And then j is equal to I. The mid is lined up right there. And now it's not equal. So then we pass. Oh, the answer is one. I think. Actually, I think it would be simpler when we choose random, to choose it between zero and minus one. So inclusive, exclusive. And so that way, if the value is zero. Yeah. That way, if the value is one, then the answer would be one. If the value is zero, then the answer would be zero. Let me double check that. Value zero. Yeah, I think, let me look at the clock too. So what were you going to say?
The Legendary Avenger: Yeah, so let me just make sure I try to pick this up. So you've defined your I and j as the sum. And just a keynote here, evaluated the sum again, which. Oh, the sum is evaluated as the last value, or actually, no. So you compute the basic sum.
Admiral Samurai: And then it's the sum of all the weights right here. I've cached it in the class.
The Legendary Avenger: I see. Okay. And then from here, what you're doing, you're setting the left and the right. And so at each stage, so you already have the random, which is saved as num here. And all you're looking for is a range that num is captured by. So if I have an, if I have any given medium, it shouldn't be equal to medium, but it should be within the range of medium minus one and medium, right?
Admiral Samurai: Yes, medium.
The Legendary Avenger: That's the condition you're looking for in.
Admiral Samurai: The range of medium minus one, because.
The Legendary Avenger: Medium is an index. Right. Like in this case, medium is the index.
Admiral Samurai: Yes. And then we set this answer to the index as we approach, as we get closer to it. And by the time we exit this loop, it will be the least value that's greater than what's in our prefix sum.
The Legendary Avenger: I see. Okay. So let's just be evaluate this again. So if, let's say we pick, let's say for some reason our medium ends up being right here, the one. Right. That might be a bit of a problem because that's, you know, the only value there that we will have is one. So medium will, I will be one, j will be one, m will be one. And so evaluating a medium minus one might be an issue, and so it might be worthwhile. Sorry, go on.
Admiral Samurai: Me, I'm trying to understand value, median minus one. Where's the median minus one.
The Legendary Avenger: So in this case. So I'll just throw it in here. So our invariant. So our invariant, that tells us we found the value. It's when our num, sorry, let's write here. So if our num falls between. So I'm going to just call this the prefix sum. And you said it's medium minus one. And this is either greater or equal to num. Or num is less than prefix here. Actually, no, this is supposed to be the opposite. So num is greater than or equals to that. Or pref here is bigger than it. So this is basically what tells us you found the right index, in which case you can even just do a return m, right?
Admiral Samurai: Ah.
The Legendary Avenger: Actually this is return m minus one. It should be the opposite. Yeah, you can return m minus one, because what this is telling you. So imagine a condition there. So you choose a number. So imagine right here. Let's look at our prefix sum. This right here. So say I choose the value five. Right? And so as I search for five, I'll start right at the middle. This will be my medium. And by your update conditions, the next search I'll make will be to the left. But how do I know when to stop? So let's say in the next condition, my medium will be six right here. And so I'll check.
Admiral Samurai: Does it folder like sort of track this here? Yeah, you'll know when to stop when I becomes greater than j. And so if it's five, then the value here will be set to. Or your. Let's see. So the random number will be set to five. Oh, wait, I see what you're saying. Yeah, I'm actually not using the num either here when. Yeah, we want to know if num is. So in this case, num is five. Right? So let's num five. Then we'll say that the num is less than the value. Like what we want to do is we want to move the j down here.
The Legendary Avenger: Just use that example. I'm going to say by this example, let's start with our five. So if, let's say m, my num right here is equals to five, right?
Admiral Samurai: Yeah.
The Legendary Avenger: So this is the number I've generated, and it's static, and my initial medium is basically at index what? So. 01234. So let's actually add another number so that it makes our life easier. I know it's usually easier to compute when you have extra numbers. So let's add a one right there and say this is 22 and then 23. Our initial medium is going to be our position. One, two, three, right. And so our vowel, as you head it up there is going to be that mid value. So 1611. 1622. So it will be at 16, right?
Admiral Samurai: Ah, yes. Oh, so you're saying if we were to start here. Yes, median. 16.
The Legendary Avenger: So in this case, I know num if you know the condition I'm going to check. So condition one, if Num is less than val. Or alternatively, you can even say if num is less than pref. And here you have your medium. You can avoid using extra variables, but it's all of one, so really not going to punish you for that. But in this case, you know for sure you're going to keep searching left, right. So you can make a note search. Yes, that's, that's what we know. Right. And so we know for sure that our j is gonna be m, but our eye is gonna stay the same.
Admiral Samurai: Yes. Yeah, yeah. The binary search to search left. Yes.
The Legendary Avenger: And then the opposite is true. So if it's greater than it, Elif. So Elif or num is greater than Val, then we know we're going to search, right? In which case our I is going to be m plus one. So search, right? So move it to wherever it is and keep searching. You don't want to search the medium again, because this one is, you know, we can meddle around with that, but what I was saying here is this, you can actually make this a second condition. So this is typically something I advise my candidates to do. Always start with the invariant. So you know for sure if, and the condition is right here, if you have this, of which in my case, I'm using pref m minus one. But the reality is it's more so just the mid. So it's Val. You can replace the pref here with Val. So if you're going to say if Val. Actually, this might be a bit tricky, because if you fix the value, it might actually not allow you to check the previous one. But if you stick by index based reference, then you immediately return the results. So this is, this is the actual index you want. So these are the three conditions you're checking for, in which case you return the second condition you're checking for. There we go. And this you can just say by checking prefm. And similarly, it's prefmit pretty much the same conditions, prefm, and you're searching left or searching right. So those are the three conditions. And you return medium. We know for sure we always gonna hit something, because we always, we're always going to have a result. So in fact, you can even say break and then return m minus one. You can say break and then return m minus one if you want to have a neat piece of code.
Admiral Samurai: Yeah, yeah, I see that you're getting those, but.
The Legendary Avenger: Okay, yeah, pl. There, I picked up the logic. I think it makes sense, you know. Okay, let me turn off interview mode quickly. You might notice this in some of the interviews. So for context, this is me being the kind of interview I tend to like. I don't like seeing my candidates stuck, especially when I can see they already know how to do it. But that said, it can actually backfire slightly. Because if I see that you have the logic but you struggle with implementation, it might not look good. You might get a point. You know, I can get, I can let juniors get away with it, but I would expect that a candidate who sees the solution actually knows how to implement it faster. But if you struggle to find the solution but then you implement it faster, that's actually a positive signal for a junior. And so I would advise. This is, this is my quick tip on this, because binary search is very common. Get a template for it. Like, you know, you could type it out, print it, put it on a wall. Like, you know, just, there's binary search, there's implementing a binary tree, a couple of traversal techniques, all of those, they're very standard, and so you can just print them out, have them on a page, because it's going to be a video interview. You can just quickly scheme whenever you see any of these techniques. The common techniques only go into deep thought if you must. And then here's the best trick you'll actually find to work a lot at meta. Don't implement anything you don't need to. That's just a quick tip. So in this regard, we knew that the core logic was binary search for optimization purposes. But you could have told your interviewer, while you're doing the main implementation, let's assume we have some binary search function that will maybe see if this value exists, and the invariant is this range. So just assume this is the binary search function and they give it the condition. And then you tell your interviewer, let me go with the call logic. And then if, you know, should time allow, we can jump into the weeds of implementing this, that will allow you to make a call to this ghost function. So you can say, assume we have a binary search function, and, you know, you can call it a binary range search or something. A binary range search function. You give it a value, a start and an end. So you tell it val start, and you tell them, let's assume this exists, and then you proceed with the rest of the logic. So in this case, you know, this is what you're searching, you implement, and then you have the prefix tree, and then you can touch on this later on.
Admiral Samurai: I see. And since meta doesn't require us to compile the code or necessarily even run it, maybe that's okay.
The Legendary Avenger: Yep, it typically will be okay. Exactly. In fact, I'll give you some this question was actually asked in my final rounds, and I didn't have to run it, and I didn't have to implement the full binary search. I simply had to just run through the core logic and write this invariant. So when I wrote this invariant, it was enough for them. I didn't even have to do the run through, because I just explained what I'm trying to do. And so since most interviews want to see you run through the full logic, you've already found the optimal solution. So what they're expecting is you at least understand how it works. And so if you just, you know, in this case it's called for, you know, forgoing the implementation. You forego the implementation and then later on you come back to it and maybe add a few weeds here and there, you'll be fine. You won't have to get stuck on minor details, let's say out of range errors or such, but still practice so that you at least have familiarity with where you could get caught when it comes to the implementation detail.
Admiral Samurai: Yeah, yeah. There's definitely, like under pressure, it kind of, it's hard for me to write this right away. Maybe I would want some tests or something to, you know, and leverage the compiler interpreter to make it a little easier or stepping through it as possible just takes a lot of time. But yeah, what you're saying makes sense. Yeah, but maybe I could sort of write some pseudocode or maybe the interviewer will have some mercy.
The Legendary Avenger: Let me do this. I want to make sure I give you a full test. So I actually have notes I've taken. If you've listened, you've had me aggressively typing. So I have a good amount of notes that will address pretty much all the points you brought up. So don't worry about that for now. I'll post you and throw you in the deep end. Again, I'm sorry for that, but I'll give you another question. I want to see how you go through this. And for context, as far as I know, this is perhaps the most popularly asked question. Like, literally, I've not met any candidate who's like, I've met like five candidates, six candidates who've gone through the process, and they were all asked this question in one of their rounds. I don't know why it's so repeated, but let's just go through it. And why not, right, so you're given a binary tree, and mind you, it's not a balanced binary tree necessarily. It's just a binary tree. Your job is to return the vertical order traversal. By that, what I mean is assume this is our tree. So let's create a tree. So you have a tree, we have nine here, we have, let's say a 20 here, and then to the left of this, let's say to the left of this 20, we have a 15, and then to the right we have a seven. And so assume this is the child of the one right there. I don't want to be ambiguous about it. So this is the child of the 23 is the nine. So the vertical order traversal. So v o t. This is going to be start with nine followed by three and 15, which are technically on the same level, 315. You can, you can return this. So you can return a flat list. It's up to you. I'll give you the freedom to make it easier. It's actually at this. And then followed by our 20.
Admiral Samurai: And.
The Legendary Avenger: Then followed by seven. So that's our vertical order traversal. So another tip. Just think of it as if you were to shine a torch to the left of this tree. How the values pop up. And so that's what I would like. I would like you to do.
Admiral Samurai: And this three and the 15 are sort of on top of each other. Is that right? Is that like, if I were to exact.
The Legendary Avenger: Yeah.
Admiral Samurai: Okay, I think I see. Yeah. And because. Yeah, the right child of three is 20 and the left child of 20 is 15. They end up in the same. Us 15, they end up in the same. Sorry, is this a. This is also an array here, right? Okay. I'm just making sure.
The Legendary Avenger: Yes. Yeah, they all arrays. But, you know, if you feel like it's easier, you can flatten the list so you can make it one list. You know, I'm not too worried about that.
Admiral Samurai: I think I would want to. Let's see. So we have this binary tree go over through them. I think we could sort of like do a breadth first search, but like somehow track some kind of relative positioning. And so the first item is three and if we position that at zero and then their next items are nine and 20. And this would be, let's say negative one and this would be, say plus one and then after and the 20 would give us. I'm kind of like thinking about this sort of recursively, but this would give us 15. But then now it's going to zero, which matches with the three. And then the seven goes to two. And then we can, if we have like some kind of dictionary, then we could see that zero matches to three and 15, as we can see here and here. And then negative one. And this preserves the ordering matches to nine. One matches to 22 matches to seven. So maybe we have some kind of dictionary. As we do a breadth first search, we can populate that dictionary. That sounds reasonable. Try to write some code. But.
The Legendary Avenger: Yeah, that makes sense to me. Yeah, feel free to implement that.
Admiral Samurai: Okay. And, yeah, switching out of interview mode. I think I've seen this problem too.
The Legendary Avenger: I could tell. But that's the thing. The way you presented it was perfect. So that's it. That's exactly. Don't tell the interview. Just assume you've not seen it. Pretend to struggle a bit and blow it out of the water, because at the end of the day, you want the job. Couldn't care less if you could flip a binary tree or whatever the bullshit this company has nowadays. We just want the money. We want prestige. Cool. Let's get it right.
Admiral Samurai: Yeah. Yeah. I put in a lot of work, and, yeah, it's been eight years at startups. It'd be nice to have a public company to work for. But, yeah, I've been studying a lot of these, but, yeah, I just want to do well, and I do enjoy doing it, I find, you know. Anyway, all that aside. Yeah. So here, I would say, quick note.
The Legendary Avenger: The only maybe caveat I might give you here is look at this. Look at line 41. We have 315. We do not have 15 three. They're actually ordered to. Can you see the order?
Admiral Samurai: Yes. Top to top to bottom. Do we want 315? Right?
The Legendary Avenger: 315, no, 15. Yeah, 15 three is not valid. But 315 is, and, you know, it shows the two dimensionality of the key. So you got the, you got the relative positioning to the root. That's perfect. But there's also another position to worry about, the vertical. The verticality of the position. So in this case, this here, yes, it's the leftmost, but it's on level two. Right. And so in this, sorry. These two, they're on the same level relative to the root, but they're not on the same level when it comes to verticality. So you need to make sure you're also noting the depth of the values or the nodes. So value one relative to the root, value two. The depth.
Admiral Samurai: Ah, does it have to be the depth or if we just insert them in the queue in order of their depth, that might capture.
The Legendary Avenger: That's a good note. Yeah, that should actually work. Yeah. So it's more so dependent on how you implement it, because I know some people just do a normal traversal, some people do an in order traversal or some other weird approach. And so, really, so long as the implementation matches, I'm okay with it.
Admiral Samurai: Okay. Yeah, so I think, and so I want to mint in a max too, because I don't know the bounds of these. So here, I'm just gonna, let's see, like, or I don't know. Let's see. But, yeah, yeah, I think I see what you say. Yeah. So what do we do here? Root and zero. I'm going to pre populate that. And this is just going to, yeah. So this is going to match level to an array and the ray will be top down. And since we're doing a breadth first search, everything is, we're going level by level. So that should catch it. So we go node and this will be like column, I'll just say, so we got this. And then if node left or don't want to get ahead of myself, I'll just say d of column equals append node. And I'll make this a default dictator for a list just to initialize all that. Okay. And then, yeah, if there's a node. So if there's a left, the node has a left value, then we want to do Q append left and then call. Yeah, I think that's the trick here, is doing this minus and plus and also these min values. So the next thing we want to do, once we have this, now we have our dictionary populated with each of our columns and their associated arrays. But now we need to stitch that together into a solution, ordering the columns in increasing order so that we can build up this 2d array. So we want to return the solution. And so to do that, we want to track the Min columns and the max one so that we can iterate through them. And then we can go Solution append d of. I think that's it. Yeah. And this should preserve the order. So yeah, we're going top to bottom as well, since this is a Breadth First Search, so should preserve the order as we insert them into our lists.
The Legendary Avenger: I see. So let me see. So you have the root fast, the double ended queue, right? And so as you run through this, what you're doing is you have a mean Value and a max Value. And what you're doing is you're checking while the Queue has something to the queue, to the left of the queue, you are pending the left node if it exists and the right node if it exists. So essentially you'll always have that order. So right first and then left, is that it? Because you're checking this and then you're pending left and then you're checking this and then you're pending right, and you're doing, in both cases, append left. So they're always coming into the first of the queue. And so when you do a pop, which one is it gonna pop first? It's always gonna be the right hand, the right movement queue. Yeah. So that way this is a fifo.
Admiral Samurai: Yes. So that way we're. Okay.
The Legendary Avenger: Think through that first. So depending by the order of insertion. So if you're adding the right node second and you're always doing an append left, it means that. So maybe run through this example and see how they're going to be inserted into the DQ.
Admiral Samurai: Yeah, yeah.
The Legendary Avenger: At least for that.
Admiral Samurai: So here we'd start off, see how that works. Value three and it's zero. So let's say this is our queue. And then we pop that off. And then we insert to the left nine, negative one as well. And then we insert to the left of that 20 and positive one. And then our dictionary will now have zero maps to three, an array of list array containing three. And then we pop off nine, negative one. And then we insert to the left. Oh yeah, nine, negative one. And now we map negative one to nine here in our dictionary. And then we look at the children of nine. Oh, there are no children of nine. So that. So then we continue and then we pop off 21, add that to our array. And then we take the children, we look at the left child, 15, and this is zero and seven and two. And then now when we pop off from the right, we pop off fifteen, zero. And since zero is already here, we look that up and we add 15 here. And then 15 has no children, so we don't add anything to the queue. Then we pop off seven and two. And then two is here. And we add seven. And then we iterate through the dictionary in ordered key pairs to build up our solution, which is nine, three, 1520 and seven, which I believe is the answer. Yes.
The Legendary Avenger: So, okay, so ordered key pair. So you mentioned negative one and nine. And so I'm assuming that will be negative one and nine followed by zero and three and then one and 20 and then two and seven.
Admiral Samurai: Yeah, because it's negative one. This is zero, this is one, and this is two.
The Legendary Avenger: I see. Also just based off of the order. Okay, that makes sense. Okay.
Admiral Samurai: Yeah. And we get the order because min value equals one, max value equals two by the time we're finished. And so that's how we can sort through the keys in order.
The Legendary Avenger: Yes, that makes sense. And so you're technically going to have to sort the keys, which is all log n. Log n. Right.
Admiral Samurai: I don't have to sort the keys because I know that between min and I can just iterate through the range. As you can see at the end here, we don't have to sort them since we're tracking the min and max. Then we just iterate from min to max in that contiguous range. And then we add those values to our result, to our 2d array.
The Legendary Avenger: I see. And is there a guarantee that you might have that tells you you will always have a value. Let's say if you start from negative one, do you have any guarantees that negative one will have a value? Zero will have a value to warranty the iteration.
Admiral Samurai: Yes. We always have to have value because we are only incrementing or decrementing the starting value by one. And every time we do that, we add a node. And every time we visit or pop something off the queue, we append it. Here, we append it to the dictionary. So it's a contiguous range. Yes. From the min to the max.
The Legendary Avenger: That makes sense. Okay, cool. All right, so you can take interview mode off. I think this is good. And they have a good sense. Or maybe the only questions I can ask. Performance space complexity, time complexity. That way we can at least close the loop.
Admiral Samurai: Yeah, I mean, yeah, I feel comfortable with all of those. Yeah. In this case it would be o of n. Runtime space was also o of n for the queue and the dictionary. Yeah.
The Legendary Avenger: Awesome.
Admiral Samurai: Yeah. For the first one it was log n, but o of n to initialize this upfront and then login for the binary search. And the space is o of n to store the prefix sum. Perfect. Cool.
The Legendary Avenger: All right, so interview mode of. I know there was a lot of pressure. So before I give you any feedback, you know, the way I like going through this is I will first ask you. So, looking back at the interview, what do you think went well? What do you think would have gone better?
Admiral Samurai: Yeah, well, I mean, I was able to recognize both problems, so it helped me understand there was never an issue of, like, how to solve the problem. Probably because I've been grinding a lot of elite codes. I think what could have worked on. I definitely got a little stuck here on the binary search, but. Yeah, we talked through it, but I definitely installed a little there.
The Legendary Avenger: That makes sense. And to your point, your feedback is somewhat consistent to mine, only that I get into a bit of nitty gritty detail and will also throw in some feedback. And mind you, I'll give you copies of all these notes, so you'll have them in the feedback form in case you want to run through them. But for the most part, you have easy vibes, easy to talk to, which is awesome. You don't want to be working with the person who you're not really able to talk to. I found it really easy to work with you, which is perfect. Keep that same vibe, you know, likability is one of the things they'll be looking for. And then. Yeah, I gave you that. I think I already told you this bit. Don't mention if you've seen a problem, trust me, so long as you act like you're thinking or such, you'll be fine. And so maybe the only quick tip I might give you on this point is if you see a question you've noticed before, because typically if you've seen it, then you have multiple solutions, starting from a naive approach all the way to the more complex one. The way I advise my candidates to run through this is for the past two, three minutes, run through these solutions as though you're thinking through them. So you can say, okay, I can see an approach where you can do this and describe the naive solution. And then you say, but the downside to that is this operation here might not be efficient. So maybe an optimization you can have is to throw this approach here in the first question. It's really really easy to see how that would work. You just tell them, I can create this prefix list which is built on cumulative sums, at the end of the day, generate a random number and then evaluate where it falls within the range. Then you say, this will take this complexity, but then you tell them, but searching through this, you know, might be expensive. If I do it, you know, then, so because there is a bit of ordering, let me throw in a binary search here. It shows you have that basis covered. You easily show that you've thought through it, even if you know what you're doing already. You just show that you thought through it. And so if you do it with, let's say, 70% smoothness, 70% to 80% smoothness, so that it shows that you're kind of like almost thinking through it as you go. If you're just perfect, it might actually be a red flag, but for the most part, meta doesn't care. But try not to be too perfect, but get close to perfect. Like start naive, optimize immediately after, and then immediately go to code. Another quick note is simplicity goes a long way, so try and make sure you're choosing the simplest structures and you know, things that maybe speed you up. So I like the DQ, don't get me wrong. But in this case a simple order dict would have worked and you'll just simply needed to do a binary bfs on its own. You wouldn't have even needed a queue, could have just used a list, traverse from the root, assume that's the relative verticality and that's it. You could have done that and then at the end of the day just sort based off of the keys. So, you know, and you know, in this case, yeah, I'll actually show you how I implemented it. And, you know, yeah, if you could.
Admiral Samurai: Send it, if you have a solution, you can link or paste here. That would be interesting to see.
The Legendary Avenger: This was my approach. I just used a stack.
Admiral Samurai: Okay.
The Legendary Avenger: So you can see it's literally just creating a stack, and then at the end, pretty much the same thing you did, only that there was no exclusive step, everything was the same. Right.
Admiral Samurai: Okay, yeah, I'll take a look at this. This is good.
The Legendary Avenger: Yeah. But mind you, this is not like critical feedback. If you know how to do it, you're good. Like, at the end of the day, I would have probably given you a pass, especially because at the end of it, you talked to, you justified the approach by mentioning the contiguity guarantee, and so you had an optimization that even I didn't have, which is awesome. So if you actually have that kind of point in your interview, even if you struggle with the first question, your interviewer sees your technical skill right then and there and. Perfect. That's what you want. You want to impress them and leave them. Okay. I learned something from my candidate today. And then I was gonna suggest, okay, let me do that. Because I hate, I hate seeing the linting, because for some reason, it gives me anxiety, tells me, broke the code or something. I was gonna say, another key. Another key bit that I would urge you to do is learning how to kind of like, forego, even in how you present the interview. And an example here will be, if there's bits of code that seem relatively obvious, you don't have to describe them. You can just tell your interviewer, I'm going to do this and that and that, and then code in silence. In fact, that might speed you up, because then you're not stuck explaining every step. And be mindful, because with meta interviewers, for the most part, they'll be quiet. So because they know speed is of essence, they're not going to interrupt you. A lot. Like in this case I did, because it's practice. But in the actual interview, for the most part, they won't interrupt you until towards the end. And so describe and then code in silence if need be, but not, not like full silence, like, you know, describe in two or three sentences and maybe take a minute or two to code it out.
Admiral Samurai: But I'm probably more on the verbose level right now. I see. And so maybe like, yeah, don't let that slow me down. Gotcha. Yeah, that makes sense.
The Legendary Avenger: Exactly. Precise. That's, that's, that's a perfect. Rewarding it all. Yeah, my mind is too fried because it's Friday to think that way. But. Exactly, that's, that's exactly it. And then I think I already told you to like you, you know, forego some logic. So if there's any bit of logic that's helper, then just, you know, assume a function exists and then essentially code it out later. I would say I like the use of classes, but as you saw, some, sometimes they make it hard to essentially do some references. So to me, when it comes to interviews, the highest level of modulation I usually go to is functions because, you know, the shared namespace of the iD is basically all shared variables. It's kind of like a predefined class. So if you just use a function, for the most part, the interviewer knows, okay, this person knows how to modulate their code for reusability. So if you find it easier, if you can avoid classes whenever necessary, avoid them. But if you are comfortable using them, by all means. It's just that, you know, for some candidates, they usually get surprised and they tell them it's okay not to use the class. But, you know, if it makes it easier for you to do that, then feel free to skip them and just modulate using functions and stick to that. Does that make sense?
Admiral Samurai: That's a good point. Yeah, yeah, that makes sense. Thanks. Yeah, yeah.
The Legendary Avenger: But other than that, I would say if I was to gauge you, I'll give you a pass. It's not a strong pass, particularly. I think you kind of had the sense, especially the first question. We could use a bit more speed there. But to me, I picked up enough signal to see that technical beats that I'll be looking for. And you had almost like a redemption arc with that second question. It was like you even taught me something. I was like, oh, that contiguity guarantee was awesome. It was good to see. So in there, you know, if this was the actual interview, I'll give you like a 3.5 out of four kind of pass. So that was actually a pretty good performance.
Admiral Samurai: Okay. Thank you. Okay, good to know. Yeah, this. This is helpful to know. Yeah. Um. And. And, yeah, it's. I think I just hope that the problems are ones that I've seen before, because, yeah, it makes me nervous, given, like, yeah, the time constraint. So.
The Legendary Avenger: I would say I'll guarantee. I will guarantee you that they will all come from leetcode or. Okay, let me not give a guarantee. I'm 90, 90% sure they'll all come from. There might be a variant, especially. I'll say, do this go into leetcode right now, sort it by popularity and recency so you know the frequency and recency. If you solve the top, let's say, 50, you would have captured 80% of the questions that are likely to show up. I think I'm about, that's a heuristic that I know we look, huh?
Admiral Samurai: Okay, I'm about there. Yeah.
The Legendary Avenger: And then, okay.
Admiral Samurai: Yeah, yeah.
The Legendary Avenger: So if you sort them, pick the top 50 by frequency, most likely all the questions you're gonna ask are gonna come from there. And then maybe the extra addition I might give there is, let's see, for the top. Oh, the third question is usually a bit trick. You don't have to get it perfectly. And here's another nifty trick. So if you find yourself kind of crunching, it's totally okay to tell the interviewer, okay, I'm mindful of time, so let me try and code the rest of this in silence and then I'll do the analysis and run through at that. If you just tell them that it's okay to code completely in silence for like five minutes. So this is usually the case if you find yourself, let's say, stuck slightly and you're kinda in that pressure zone. Because I know sometimes speaking and coding throws people off. So long as you communicate it, it's totally okay to do it in silence and go through it faster. And that can actually help in case you need to make any references as such. Okay.
Admiral Samurai: Yeah. Should I ever try to run the code? If I feel like, if I want to, like this binary search at the end, like I felt like I just needed to tweak it and verify that it worked, would it make sense for me just to start the interpreter and just run it? Or is that kind of like a, not a good rabbit hole to go down?
The Legendary Avenger: I would say I would avoid it particularly because if you find a bug, then it kind of invokes in the interviewer. Okay, so let's see their bug solving prowess. So typically I avoid running the code just to make sure I'm not dealing with bugs. But, and this is another thing I actually doubt they give you a runnable environment. I don't think meta gives you a runnable environment. I think they disabled, they disable that. But for the most part, you know, yeah, you know, I would say just don't do it. Maybe do a run through the same way you did. But yeah, I would avoid running it because, you know, actually, let me be specific that don't do it because if you actually catch bugs, then you'll be expected to solve them. And this is usually with major bugs, or like in this case, out of bound bugs, which, trust me, you don't want to start fighting. You should take five to ten minutes and you have know another ten minutes to solve another question, so you don't want to be stuck with them.
Admiral Samurai: True. Okay, makes sense. Yes.
The Legendary Avenger: Oh, and quick general comment. Think of these two questions as a chance to show, you know, your expertise. So if you find yourself, let's even struggling with the first one. It's not over yet, because you can blow their mind with their solution to the second one. So don't ever feel as though, okay, the first one has killed me. This is all done. Like, am I actually mean this? Because here's another thing most people don't know. Meta will actually ask for follow up interviews. If you had an extremely strong performance on one question and maybe struggled with another for context, that's exactly what happened to me. So I struggled with one question, solved the other one perfectly. And even with the one I struggled with, it was the same situation as you, where I got the answer verbally. I optimized it, but then when coding, I don't know what the heck happened. And this thing is high pressure, so sometimes you're thrown off. So all they did was just ask for a follow up interview the next day, which I did well in, and that was it.
Admiral Samurai: Okay, that sounds good. Yeah. And so, yeah, we went over like breadth first search, depth first search, binary search. Are there any high tricky things that I should have down? You mentioned, like patterns. Right. I have a pattern in my head for these. I probably need to brush up on some of my binary search patterns. Any other, like big patterns that come to mind? I know, like, dynamic programming isn't on the list, really. But are there other big ones?
The Legendary Avenger: That backtracking is one that I tell people, just make sure you master it. But if I was to just give you a general, a general heuristic, go with what nitcode has done, like, it will run you through the questions in order of popularity. So I'm assuming you know nitcode because you literally have nitcred premium, so you need code. So he basically breaks them down in order. I'll say go three or four levels down the roadmap, avoid, let's say, the niche questions. So once it gets into, let's say, into, you know, things like advanced topics, avoid them. Math and geometry. Now you're not going to be asked that, so I'll follow that and maybe stop at backtracking. You don't need to worry about graphs. You don't need to worry about bit manipulation and the rest. But the rest are kind of fair game. But a general heuristic is stick to lit code. Trust me, that's all you need.
Admiral Samurai: Yeah. How about. Yeah, graphing problems. Do you ever see, like, what do you call it? I mean, maybe topological sort, but. Or even bipartite graph or union find. Are those common, or do they happen? Do they come up?
The Legendary Avenger: Yeah, I've never asked a candidate that. I've never had a candidate being asked. I I would not rule them out, especially because with these questions, there is usually multiple approaches. So, for a lot of topological thought problems, they usually, you know, a topological thought usually appears as a variant of, let's say, some graph approach or something like that. Graph problems are relatively more popular, but not in their pure form. And, you know, an example here, let's say they can find one that I know has been asked before. I think it's called simplify path. I've seen that before. That's actually a string processing question. That's the only one that I kind of saw as being more graphy. But I would say they will not be asked, like, explicitly, necessarily graphs. You know, I'll say, if you're going to go, complex graph is probably where I'll put, like, you know, an end to it. It's like, I don't think it will get any more advanced than that. Yeah.
Admiral Samurai: Okay. That's helpful. Thank you. Yeah.
The Legendary Avenger: Awesome. All right, any other questions? Anything else I can help with before we end?
Admiral Samurai: I mean, I have a bunch of questions about the system design portion, but I don't know if. Yeah, yeah, I don't know. Yeah. I used to live in Seattle, so I'm gonna move back there next year, but, yeah, it'd be great to. I don't know. Maybe we'll run across each other someday.
The Legendary Avenger: I mean, it's like, you know, I leave my contact, feel free to ping, and who knows if you end up here. By all means, I'll be happy to meet up sometime.
Admiral Samurai: Yeah, I've lived there for 15 years. I miss it. I mean, I'm down in LA temporarily, but I'll be back up there, and. I don't know. Yeah, maybe we'll be in the Facebook offices. I don't know. I don't know. I don't want to get help myself.
The Legendary Avenger: But, yeah, I am jealous of you because in my case, I'm trying to flip it. I want to go back to Kylie because this weather is killing I don't like the cold and the gloom. It reminds me too much of London, where I live for a while. But, yeah, it's Seattle. You learn to love it, you know, busy, poopoo point, and then you're like, okay, this is beautiful.
Admiral Samurai: Yeah. Yeah, I love Seattle. Yeah. I mean, this time of year, it's.
The Legendary Avenger: Getting better, but yeah.
Admiral Samurai: Yeah, I totally see what you're saying. Yeah, everyone. Yeah, everyone loves the sunshine down here. I am a little bit too hot.
The Legendary Avenger: I hear you. That's a flip narrative in this regard. But here's the thing. I feel confident in you. So by all means, go in this confident. Keep practicing. And I'll say worry less about, like, the technical problems, because I feel like you actually know how to code. But get yourself comfortable with navigating being stuck, you know, a bit of pressure in the interview, because that's, that's kind of what I felt in this interview. You're really good at what you do. I can see the knowledge. But at the end of the day, the reality is it's hard market. You already have the basis. So for me, just get yourself into that interview mode, and you're gonna nail it. Because with meta, I tell people meta is one of the most crunch, easy style interviews to prepare because you know what to expect. But the problem is, what to expect is almost like, you know, it's kind of like a race. You know, you're going to the grand tree. You need to make sure you really know your path. It's, it's not going to be a trick. It's not going to be anything, but you damn better make sure you're not going to get thrown to the wall or something along the lines. And you'll meet some shitty interviewers. You'll meet some great interviews for the shitty ones. Get those nifty communication tricks, because it's, I would say it's 80% communication. Because if you got to the finals, there's a baseline competence. Assume you're already good at coding. So it's more or less about navigating. People will be hard to talk to, people who have accents. So navigate those with that bit of care where you just be mindful and make sure you go through those two questions. If you go through those two questions, pause if need be, like, you know, if you're going to split the time I tell people, see if you can balance them within, let's say, 1515, which leaves, let's say, ten minutes for running through a bad question. And if you find yourself, let's say, struggling with the first one, for the second one. If you've seen it before, don't even bother with that naive thing. Just propose the optimal one and go through it. You just want to make sure you go through them. Sure. You can code. That's it. That's all they care about. Okay.
Admiral Samurai: Yeah. Okay.
The Legendary Avenger: That makes sense.
Admiral Samurai: Yeah. I'm working on my confidence, too.
The Legendary Avenger: Yeah, yeah.
Admiral Samurai: It's another thing, I think that. Yeah. Selling myself is definitely a skill that I am working on.
The Legendary Avenger: Yeah, yeah. Don't worry about it.
Admiral Samurai: Yeah.
The Legendary Avenger: Like, to me, it's like, what you did here was good. So just do this. But with, you know, with a bit more straightening of the wire, it's like, it's a somewhat straight wire. Just straighten it a bit more. And that's it. As I said, it's a 3.5 out of five, so 3.5 out of four. So it's not that there's a lot lacking. It's just, you know, bits of communication here and there. And you, you know, I feel like that's easy enough to refine within a period of, like, a weekend or something like that.
Admiral Samurai: Okay, thanks. Yeah, yeah, I'll take it. Yeah. Hopefully I can replicate it on Tuesday.
The Legendary Avenger: Yeah. Awesome. I'm gonna have to drop off, but it was fun talking to you. I hope it goes well, and I'll be looking forward to having you at night. Okay.
Admiral Samurai: Yeah, that'll be great.
The Legendary Avenger: Hopefully.
Admiral Samurai: Yeah, maybe we'll cross paths. Yeah. It's great chatting.
The Legendary Avenger: You got this.
Admiral Samurai: Cool, thank you.

We know exactly what to do and say to get the company, title, and salary you want.

Interview prep and job hunting are chaos and pain. We can help. Really.