Amazon Interview Question for Software Engineer / Developers


Country: United States
Interview Type: In-Person




Comment hidden because of low score. Click to expand.
9
of 11 vote

Take any 2 people in the set, ask if A knows B. If A knows B, A is not the mayor. If A does not know B, B is not the mayor. Either way, one person is always eliminated. After asking n - 1 such questions, only one person will remain. You can then validate that the remaining person is in fact the mayor by asking whether they know everyone else, and whether everyone knows them (2 * (n-1) questions). I haven't tried to optimize the constant factor, but it's O(n) questions.

- eugene.yarovoi September 24, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

>> Either way, one person is always eliminated.

if both know each other or they don't know each other, then both of them need to be eliminated.

See my argument above that precisely captures all the cases.

>> After asking n - 1 such questions, only one person will remain.

You actually need to ask 2n-2 questions. Also, there is no guarantee than only one person will remain. It can also be the case that no person remains in the end if there is no mayor. Again, see my argument above for precise details.

- Murali Mohan September 24, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 2 votes

Your approach seems overcomplicated. Maybe we understand the problem differently?

Can you tell me what you think is wrong with my argument? I've given a precise argument why exactly one person will be eliminated with every question. To recap:

If A knows B, A cannot be the mayor, since the mayor knows no one.
If A doesn't know B, B cannot be the mayor, since everyone knows the mayor.
Therefore, we can always eliminate one person with every question.
We start with N people.
Therefore, once we ask N-1 questions, we'll be down to a single person.
If there exists a mayor, that person must by necessity be the mayor. If there is not a mayor, then we may have returned a bogus answer. Hence the validation step that I mention.

- eugene.yarovoi September 24, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

Yes, eugene.yarovoi is precise.

- __algo_buff__ September 24, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

@Eugene

Yeah, your approach is correct and elegant. The solution does not need the verbosity I gave. I could have refined my elimination step to disregard one person at a time as a Mayor instead of bothering about two. That also reduces the number of questions to be asked. The final validation step is necessary as I too see it. Great answer!

- Murali Mohan September 24, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

Mayor is the sink node in topological sort of the graph.

- varun October 08, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

@Varun: building the graph would involve O(n^2) API calls. Hence the use of the method I gave, which uses only O(n) calls.

- eugene.yarovoi October 08, 2013 | Flag
Comment hidden because of low score. Click to expand.
1
of 1 vote

Provided a 2*2 matrix is given as input, the below should take O(n+m).
A n*n 2D Matrix.
A[i][j] = 0 means P[i] does not know P[j].
A[i][j] = 1 mean P[i] knows P[j].
A[i][i] = 1

1. Start from A[0][0]. Move row wise.. In other words we stick to the column [j] as long as we don't have evidence that P[j] can not be a mayor.
2. At each position A[i][j] (i.e. P[j] under consideration) check A[i][ j]
3. If 1(i.e P[i] knows P[j]) then P[j] can still be a mayor. Stay in that column do i++.
4. Else if 0 P[j] can never be a mayor do j++ and move to next column. Start scanning from current i. Don't reset it to 0.
5. Once you hit the end of a row. i.e. j = N. with i<N, then there is no mayor.
6. Else if you hit the end of a column. i.e. i = N, then scan the column a[i->N-1 to 0 ][j] for all 1s. If all are 1 then P[j] is the mayor. Else no mayor exist.

For e.g. Let say there a 4 ppl. A B C D. And C is the mayor.

Let say the matrix is:
A B C D
A 1 0 1 1
B 1 1 1 0
C 0 0 1 0
D 1 0 1 1
1. Arr[0][0] = 1 => i++.
2. Arr[1][0] = 0 => j++
3. Arr[1][1] = 1 => i++
4. Arr[2][1] = 0 => j++
5. Arr[2][2] = 1 => i++
6. Arr[3][2] = 1 => i++

i = 4 & j<4. Scan the Column j i.e.=2. all are 1s. Therefore C is the mayor.

- sd September 23, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

sd that looks interesting, maybe you can explain it better
you said:

0
of 0 vote

Provided a 2*2 matrix is given as input, the below should take O(n+m).

How can it be O(n+m) ?

Building an adjacency matrix is n^2, even if you only set a few 1's in it. Who is going to 0 initialize your RAM locations for you?
1) interpreter/VM/JVM -> it will have to zero initialize the object
OR
2) If it's a compiled language, and your array is static in duration, the runtime code that loads your program will have to 0 initialize.
OR
3) If it's a compiled language and your array is off the heap or the stack, you have to 0 initialie it yourself

So it's O(n^2) to build the thing. And imagine a town with 1 million people, the array will require ~ c*10^12 bytes of memory

- bigphatkdawg September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

You are right. That's the reason I mentioned if the input itself is in form of adjacency matrix, then this can be done in O(n+m) time complexity.

n sorry I meant n*n matrix and not 2*2 matrix

- sd September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

ok :)

- bigphatkdawg September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

@sd: why cant we directly check for all 1's in all the columns in a adjacency matrix.What is the point of having this i++ and j++ magic?

- aka[1] September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

That will be a O(N2) Solution

- Anonymous September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

@anish: It will a O(n2) solution if we scan each and every element.

- sd September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

Correct me if i am wrong, but does this essentially mean that we are searching a row from a 2D array where every element except a[i][j] (where i=j) are O.

- ashishB September 24, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote

Assuming that the there is a mayor in the collection of people provided

public person findMayor(person[] P)
{
   if(P.length==0)
   return null;
  int i=0; int j=P.length-1;
  while(i<j)
  {
      if(P[i].knows[P[j]])
      i++;
      if(P[j].knows[P[i]])
      j--;
     
  }

  return P[i];
}

if it is given that there is atmost a mayor int he people that are present then 
loop through once more to identify if P[i] knows anyone else this gives us if the probable candidate is a mayor based on the conditions given in the question

- Rohit September 22, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

if P[i] does not know P[j] and P[j] does not know P[i]
then what happened ? infinite while loop!

- ehsan September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

for both the above conditions
P[i] doesnot know P[j] it will j--
&&
P[j] doesnot know P[i] it will i--

please read conditions carefully

- rohit September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

your code is :

if(P[i].knows[P[j]])
      i++;
if(P[j].knows[P[i]])
      j--;

you have two if statement . if both of these are false then what?
you read carefully please!

- ehsan September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

paradigm that is being addressed here is that there is a mayor in the collection and thus the code. i haven't coded for at most one mayor scenario.
I will reiterate please read the details carefully

- rohit September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

ehsan explained clearly 2 times why your code is shit and there is an infinite loop possible

and you keep responding telling him to check the details.. but you provide none yourself ("paradigm" is not a detail)

while( <something related to i, and j that starts off true> )  {
if(<some shit that might be false at start>)
      change i;
if(<some other shit that might be false at start>)
      change j;
}

What happens if both if statement get skipped, genius?

- bigphatkdawg September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

So you're trying to solve a MUCH easier problem than the one everyone else is solving? Good job.
Look at your post

public person findMayor(person[] P)
{
   if(P.length==0)
   return null;
  int i=0; int j=P.length-1;
  while(i<j)
  {
      if(P[i].knows[P[j]])
      i++;
      if(P[j].knows[P[i]])
      j--;
     
  }

  return P[i];
}

if it is given that there is >>>atmost<<< a mayor int he people that are present then 
loop through once more to identify if P[i] knows anyone else this gives us if the probable candidate is a mayor based on the conditions given in the question

What the fuck does atmost mean?

- bigphatkdawg September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

ok let me give you an "atmost" solution here -

public person findMayor(person[] P)
{
   if(P.length==0)
   return null;
  int i=0; int j=P.length-1;
  while(i<j)
  {
      if(P[i].knows[P[j]])  // if i knows j then he cannot be mayor based on the constraints
      i++;
       else
      j--; // if j is not known we can be sure that j can not be a mayor as mayor is known by every one
    
     if(P[j].knows[P[i]]) // if j knows i then he cannot be mayor based on the constraints
      j--;
     else
      i++;//  if i is not known we can be sure that i can not be a mayor as mayor is known by every one
  }
//  here  comes "atmost" scenario
  int k=i;
  for(int i=0;i<P.length;i++)
  {
   if(!P[i].knowsP[k])
     return -1; // this mean the prospective candidate was not mayor as there was an ith candidate who didn't knew the prospect mayor 
  }
  return P[i]; // the identified candidate was a mayor

}

- Rohit September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

assume that we are searching for president of U.S. and the community has 3 persons. you , me and the president of U.S.
p[0] is you
p[1] is president of U.S.
p[2] is me
you don't know me. and I don't know you. but both of us know the president.

in your code at first loop i =0 and j=2 ( p[0] is you and p[2] is me)
if(you know me)
i++; // it does not run because you do not know me.
if(I know you)
j++; // it does not run because I don't know you
then while loop runs again and again , it means there is an infinite loop

I did my best to simplify the problem and explain that your code does not work!

- ehsan September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

this is going in an infinite loop guys . I tried to explain the constraints also give us a divide and conquer oppurtunity which if you are not able to see i can not explain more.

- rohit September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

Rohit,

#1) You have a much bigger ego than your skill can uphold.
#2) You do not discuss how you build the P[ ] data structures
#3) You mix up your preconditions (at most, at least) and do not solve the problem exactly. Code something that finds a mayor or returns Nil if it can't. No "at most" or "at least" solutions. Make 1 solution.
#4) You do not discuss the time and space complexity of your solution.

Stop talking about constraints. Read the original question.
Stop talking about paradigms and divide and conquer and blah blah (just because you read that chapter of the book recently).

- bigphatkdawg September 23, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote

Model the community with a simple directed graph, such that edge (a,b) means person a knows person b .
Augment your graph to answer your question fast:
In each "vertex" keep track of (update it graph updates):
1) in degree
2) out degree
{That is, you do not have to loop through adjacency lists to get the above answers}
For whole graph keep track of:
1) number of vertices = n

So your query for a possible mayor just does:
->Loop through array of vertices and checks for one that has both:
a) indegree = n-1
b) outdegree = 0

- bigphatkdawg September 22, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

The query would be O(n).

- bigphatkdawg September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

The query would be O(n)
but Creating the model takes O(n2)
so your solution is O(n2)

- ehsan September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

Yeah.
That is how I would model it for the best amortized performance over the lifetime of this community.. which I presume is forever :P

- bigphatkdawg September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

Wait, what do you mean n2?

Community graphs usually have m = O(n) .. m=#edges

So it takes O(m+n) with adj lists.
which is "usually" O(n) to build.

- bigphatkdawg September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

u check person i to know how many people he knows it takes O (n)
and you should check all person . so n*n is O(n2)

- ehsan September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

number of edges in your model is O(n2) in worst case!

p[0] knows n-1 people
P[1] knows n-1 people
.
P[n-2] knows n-1 people
P[n-1] does not know any one (he is mayor!)

number of edge in this case is (n-1)(n-1) ---> O(n2)

- ehsan September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

ehsan, you still denote the complexity as O(n+m). m is at most n^2, but the preferred big-O notation remains O(n+m) because it is a tighter bound than O(n^2)

- Miguel Oliveira September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

ehsan.... community graphs are m=little_o(n)
no community graph is even m=theta(n)

Think of why.

So building it is O(m+n)
If your community is very small and everyone almost knows everyone else, then ok m can be n^2.

But everyone will model this problem using a graph if they want to continually update the community (inserts/deletes). If you are just asking for a 1 time answer, then just brute force on whatever data structure you already have. No need to build another data structure to get 1 query answer.

- bigphatkdawg September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

you mean you create the model in O(n) ?
could you write your pseudo code? I think you need two nested loop , each one from i to n

- ehsan September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

It is O(m+n).

But community graphs usually are m=O(n).
{Think about why... if your city has a few million people, n^2 edges roughly means each person knows around 1million }

Community graphs usually have m = O(n).

- bigphatkdawg September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

dear Bigphatkdawg,
If you have the graph for this community you can find the mayor in O(n) but you don't have community graph. you should create it then use it to find the possible mayor.

the creation time is O(n2) because you have to check all possible edges. It does not matter how many edges the community has. for creation you need two nested loop to check who knows who.

- ehsan September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

You can "strip out" the parts of the graph model you don't need and target it just for this query (which nobody will do in real life cuz it's a toy problem if we do this).

Create an array of "people"
and in each "person" object store
1) count of "how many that know the person" and
2) count of "how many how many people the person knows"

There are on the order of O(n) relationships usually.
Have an array of N "persons":

pseudocode:

for each relationship (a,b): //usually O(n) relationships
{
        person[a].outdegree++;
        person[b].indegree++;
}

for i from 1 to N (num persons): //check for possible mayor
{
      if( person[i].outdegree==0 && person[i].indegree==N-1)
          return person[i];
}
else return nil:

====================
For each relationship, you do 2 array accesses.
So if (a,b), means person a know person b.
Update person a's "num ppl i know" count, and update b's "num ppl who know me" count.

So it should be O(n) unless the town is sooo small and everyone knows everyone (in which case the interviewer can find the answer even using pen and paper).

- bigphatkdawg September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote
- rohit September 23, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

A linear time solution is possible.

Maintain two sets: SetA containing all the people initially & SetB initially empty. Assuming that mayor exists in SetA, the idea is to pick people from SetA and move them one by one into SetB if he/she is not a mayor.

SetA = {1, 2, ..., n}
SetB = {} // initially empty.

Let the variable m hold the (possible) mayor. Initially m = null. Let |SetA| denote the cardinality of SetA

0. If |SetA| < 2 then "no mayor exists" else pick two elements (p, q) from SetA
1. if knows(p,q) == true then SetB = SetB U {p}, SetA = SetA - {p}, m = null else m = p
2. if knows(q,p) == true then SetB = SetB U {q}, SetA = SetA - {q}, m = null else m = q
3. if (m == null) go to step 0
4. if SetA == { } go to step 6
5. Pick a person r from SetA. set p = r, q = m and go to step 1
6 For all k in SetB, assert "knows(k,m) = true" // This step is important to handle the edge cases.

- Murali Mohan September 23, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

Nice, but tricky to understand.

- __algo_buff__ September 24, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote

It can be solved using DFS. Essentially, we are looking for a node that is not part of a cycle. We should modify the main loop of the DFS such that:

for(i=0;i<n;i++)
{
  if(graph[node][i]==1 && visited[i]==0)
  {
     outdegree[node]++; 
     indegree[i]++;
     p[i]=node;
     dfs_visit(i);
  }
  else if(graph[node][i]==1 && visited[i]==1)
  {
     outdegree[node]++; 
     indegree[i]++;  
  }
}

Once this processing is done we can find the mayor as follows:

for(i=0;i<n;i++)
  if(outdegree[i]==0 && indegree[i]==n-1)
     return i;
return -1; //i.e., no such a person exists

Its complexity is O(V+E)

- Anonymous September 23, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
1
of 1 vote

Hey, DFS has O(V+E) complexity, but note that to run DFS, you need to build the graph. Building a graph for this problem takes O(n^2) complexity as you need to compare a person with every other person to determine whether they know each other. In other words, you will have to try n_choose_2 possibilities to establish the directed edges between nodes.

- __algo_buff__ September 24, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

@algo_buff, I agree! However, it is safe to assume that we are provided with the matrix of people relationship (otherwise we can argue that we should go door to door in that city to figure it out!). This matrix can serve the graph representation to run the DFS.

- Anonymous September 24, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote

This could be seen as a directed graph problem............
If i knows j then there is an edge from i to j.
Assume an adjacency list is given, then start at any vertex and do depth first search....If we reach a vertex having to Ahead path(i.e a sink) this is the Person who is eligible for mayor position..............Also note that if there is more than one sink there No candidate eligible for mayor position........

- Anonymous September 24, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

No ahead path....

- Anonymous September 24, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 vote

O(n) time solution: We iterate the knows(a[i],a[i+1]) through the array, if A knows B, then A can not be mayor, if A doesn't know B, then A must be a mayor unless there is no one can be a mayo in the group. So once we find a false value of knows(a[i], a[i+1]), we check every one in the array whether they know a[i]. If they all knows , then a[i] is the mayor, if not, no one can be the mayor.

- Anonymous September 25, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

We are looking for a row and column combination in a matrix of zeros and ones where all the column entries =1 (every one knows this guy, that obviously include the guy him/herself) and all the row entries, except the one on the main diagonal, are zeros (this guy doesn't know anyone but him/herself).

for(i=0;i<n;i++)
{
if(a[i][i]==1) //potential candidate
{
  flag=1;
  for(j=0;j<n;j++)
  {
     if(a[i][j]!=1)
     {
        flag=0;
        break;
     }
  }
  if(flag==1)
  {
    printf("Person at Row %d is a Candidate\n",i);
    return;
  }
}
}

- Anonymous October 08, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 vote

I'm not a big fan of this problem as it cost me an interview with Google as at that time I did not really practice. Now I know better.

First I tried using a HashSet to track the possible Mayors and remove from it as I find people that did not knew each other but it seemed silly to make the problem an horrible solution as I was handling not to remove an item while iterating so an exception would not occurr.

The best solution is using a list iterate and remove using a FOR loop modifying the indexes so I did not had to worry about an exception occurring. Then verify that every knows mayor and the mayor knows no-one.

Person FindMayor(Person[] people)
{
	var list = new List<Person>(people)
	
	for(int i = 0; i < list.Count; i++)
	{
		for(int j = i + 1; j < list.Count; j++)
		{
			if(!knows(list[i], list[j])
			{
				list.RemoveAt(j);
				j--;
			}

			if(!knows(list[j], list[i])
			{
				list.RemoveAt(i);
				i--;
			}
		}
	}

	// Everyone needs to know the mayor and the mayor needs to know no-one
	foreach(var p in people)
	{
		for(int i = 0; i < list.Count; i++)
		{
			if(!knows(p, list[i]) || knows(list[i], p))
			{
				list.RemoveAt(i);
				i--;
			}
		}
	}

	return list.FirstOrDefault();
}

- Nelson Perez September 11, 2016 | Flag Reply
Comment hidden because of low score. Click to expand.
-1
of 1 vote

if P[i] does not know any one return P[i]
else check P[i++]
it takes O(n2)

boolean isMayor = true;
for(int i=0; i< P.size; i++){
        isMayor = true;
	for(int j=0;j<i; j++)
		if(P[i].knows(P[j])){
			isMayor = false;
			break;
		}
	if(isMayor){
		for(int j=i+1;j<P.size; j++)
			if(P[i].knows(P[j]))
				isMayor = false;
				break;
	}
	if(isMayor)
		return P[i];
}
return null;

- ehsan September 22, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

Explain your code please.
#1 REASON for that is, if you cannot explain it, then it probably does not work.
#2 REASON, while explaining it, it forces you to understand your code.

If P[0].knows(P[0]), then you set isMayor=false. Then isMayor never has a chance to become true.

What does your function return if the for loop reaches it's ending } ?

etc. etc. etc.

- bigphatkdawg September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

yes you are right. I had some mistakes in my code.
now it works.
I use two nested loops to check is there any person that does not know any one. that's it.

- ehsan September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
0
of 0 votes

By the way, you are modelling the problem with something that is roughly equivalent/isomorphic to a graph adjacency matrix.

Not a good idea for community graphs.

P[i].knows( )
~~> his implies that you can put any person in in the ( )

So you are modelling by graph adjacency.

It is better if you do it this way:

P[i].knowlist
~~> is the head of a linked list of everyone P[i] is related to

Now you can iterate over P[i].knowlist

And with that change, your code can be optimized for O(m+n) , where m is #edges( relationships / "knows ofs" ).

- bigphatkdawg September 22, 2013 | Flag
Comment hidden because of low score. Click to expand.
-1
of 1 vote

function findMayor(Person[] p) {
    Pesron mayBeMayor = p[0];
    for(int i = 1; i < p.length; i++) {
        if(mayBeMayor.knows(p[i]) {
            p[i] = mayBeMayor;
        }
    }
    return mayBeMayor;
}

- ssd September 23, 2013 | Flag Reply
Comment hidden because of low score. Click to expand.
0
of 0 votes

oops, the statement in the if condition should be

mayBeMayor = p[i];

- ssd September 23, 2013 | Flag


Add a Comment
Name:

Writing Code? Surround your code with {{{ and }}} to preserve whitespace.

Books

is a comprehensive book on getting a job at a top tech company, while focuses on dev interviews and does this for PMs.

Learn More

Videos

CareerCup's interview videos give you a real-life look at technical interviews. In these unscripted videos, watch how other candidates handle tough questions and how the interviewer thinks about their performance.

Learn More

Resume Review

Most engineers make critical mistakes on their resumes -- we can fix your resume with our custom resume review service. And, we use fellow engineers as our resume reviewers, so you can be sure that we "get" what you're saying.

Learn More

Mock Interviews

Our Mock Interviews will be conducted "in character" just like a real interview, and can focus on whatever topics you want. All our interviewers have worked for Microsoft, Google or Amazon, you know you'll get a true-to-life experience.

Learn More