The process begins with an email expressing interest. You then email back to schedule a call. After that, you speak with HR, who will highlight the opportunity and send you a coding test on HackerRank. Once you solve the test, you'll have a phone interview.
If you pass the phone interview, you will be flown to New York and accommodated at the SoHo Grand Hotel. On the interview day, you will arrive and be taken to a room where you will remain while interviewers visit you. In the morning, from 9:00 AM to 12:30 PM, you'll face challenging questions, typically from three different interviewers, with two questions each.
Following this, you will have lunch. Upon your return, you will be informed whether you have passed or if, despite a strong background, you struggled too much and should reapply. If you do not pass, you will have time to explore the city before your flight and will be reimbursed for expenses. If you pass, you will proceed to three less technical interviews, followed by a potential final interview with HR.
Coding Challenge:
You are given a matrix of Ys and Ns where a 'Y' at (i,j) denotes that persons i and j are friends. Friendships are transitive, so if A is a friend of B, and B is a friend of C, then A is in the same friend circle as C, even if A doesn't know C directly. How many friend circles are there? This is a disjoint sets problem.
You are given a list of strings. Removing a letter from any string yields a different string that may or may not exist in the list as an independent entity. This is one link of a "string chain." Find the longest chain in the array. Solved with a hash table.
Interview Day:
Code a function that matches regular expressions with targets. There is a DP and a recursive solution.
Test it extensively in a main. Write a function to autogenerate test cases.
Code a postfix notation calculator. This is doable with a stack. Now, what if you wanted to support arbitrary operations on some variable number of preceding numbers? How does the code change?
You are given a tree in the form of a list of (value, parent_index, in_tree) tuples, where in_tree is a boolean denoting whether the node is in the tree, and parent_index is the location in the list of the parent node of this node. The root's parent is -1. Write a function remove(index) that removes the node at index and all its children in O(n). It requires caching which nodes have been visited and a recursive function that checks whether a node in the list should be removed (terminates on parent_index == -1 or when it finds a cached node that was already removed and visited).
You are given two infinite streams of data, where each datum has fields (timestamp, value). The streams have a single function take() that pops the oldest item off and returns it, or blocks until something arrives in the queue for it to return. Data might arrive much later than its timestamp. You are given a function output(a, b), which takes two values, one from each stream, and computes something. You want to call output() on all (a, b) pairs that have timestamps less than some given interval apart, and you want to do this as soon as any data that completes such a pair arrives. Construct pseudocode that will do this. The answer involves two threads that each manage a list of numbers pulled off their stream, pull a number from the other thread's list, try to match it against everything, and then carefully discard data when appropriate.
You are managing a web service and get a complaint about the page loading slowly. What is a possible cause of the problem? How would you check that? Okay, say that's not the problem. What else could it be?
The following metrics were computed from 71 interview experiences for the Two Sigma Software Engineer role in New York, New York.
Two Sigma's interview process for their Software Engineer roles in New York, New York is extremely selective, failing the vast majority of engineers.
Candidates reported having good feelings for Two Sigma's Software Engineer interview process in New York, New York.