A Collection of Technical Interview Questions: November 4, 2008
A Collection of Technical Interview Questions: November 4, 2008
Questions
http://www.spellscroll.com
November 4, 2008
2
Contents
Bibliography 29
4 CONTENTS
Disclaimer
All the questions (and solutions) presented in this document were originally
collected by the spellscroll.com team from various sources including books,
mailing-lists and online forums, etc. The spellscroll.com team spent signif-
icant amount of time in selecting, editing and formatting these questions
(and solutions), in the hope that our efforts will be of help to people who are
preparing technical interviews. Any comments, suggestions and corrections
are welcome. This document is free to be downloaded, copied and distributed
so long as this disclaimer is clearly reproduced at its beginning. However,
we are NOT responsible for the possible mistakes contained in this
document or any improper use of this document.
6 CONTENTS
Chapter 1
Discussion:
*data = elem->data;
*stack = elem->next;
delete elem;
return true;
}
• A C++ version
class Stack {
public :
Stack();
virtual ~Stack();
void push(void *data);
void pop();
protected :
typedef struct Element{
struct Element *next;
void *data;
}Element;
Element *head;
};
Stack::Stack() {
head = NULL;
return;
}
10 1.1. LINKED LIST PROBLEMS
Stack::~Stack() {
while(head) {
Element* next = head->next;
delete head;
head = next;
}
return;
}
void* Stack::pop(){
Element *element = head;
void *data;
if (!element)
throw StackError(E_EMPTY);
data = element->data;
head = element->next;
delete element;
}
2. [Maintain Linked List Tail Pointer] head and tail are global point-
ers to the first and last element, respectively, of a singly-linked list of
integers. Implement C functions for the following prototypes:
while (curPos){
if (curPos==elem){
curPos->next = elem->next;
delete elem;
if (curPos->next==NULL)
tail = curPos;
return true;
}
curPos = curPos->next;
}
return false;
}
head = newElem;
/* special case for empty list */
if (!tail)
tail = newElem;
return true;
}
while (curPos){
if (curPos == elem) {
newElem->next = curPos->next;
curPos->next = newElem;
/* special case for inserting at the end of list */
if (!(newElem->next))
tail = newElem;
return true;
}
curPos = curPos->next;
}
3. [Bugs in removeHead] Find and fix the bugs in the following C/C++
function that is supposed to remove the head element from a singly-
linked list:
• Check that (i)the data comes into the function properly; (ii) each
line of the function works correctly; (iii) Check that the data
comes out the function correctly; (iv) Check the common error
conditions.
• Corrected code:
http://www.spellscroll.com 13
• Algorithm outline:
Start two pointers at the head of the list
Loop infinitely
If the fast pointer reaches a NULL pointer
Return that the list is Null terminated
If the fast pointer moves onto or over the slow pointer
Return that there is a cycle
Advance the slow pointer one node
Advance the fast pointer two nodes
• Code
/* Takes a pointer to the head of a linked list and determine if the
list ends in a cycle or is NULL terminated */
bool determineTerminate(Node *head){
Node *fast, *slow;
fast = slow = head;
while(true)
{
if (!fast||!fast->next) return false;
else if(fast==slow||fast->next==slow) return true;
else {
slow = slow->next;
fast = fast->next->next;
}
}
}
http://www.spellscroll.com 15
6. How do you reverse a linked list. Why don’t you use recur-
sion?
while(current != NULL ) {
next = current->next;
current->next = previous;
previous = current;
current = next;
}
return (previous);
}
// Recursive version
Node *reverse(Node *head) {
Node *temp;
if(head->next) {
temp = reverse(head->next);
head>next->next = head;
head->next = NULL;
}
else
temp = head;
return temp;
}
8. Given a linked list which is sorted. How will you insert new elements
in sorted way.
10. Under what circumstances can one delete an element from a singly
linked list in constant time?
11. What is the difference between arrays and linked lists? What is the
advantage of contiguous memory over linked lists?
• Algorithm outline:
Create the stack
Push the root node on the stack
While the stack is not empty
Pop a node
If he node is not null
print its value
Push the node’s right child on the stack
Push the node’s left child on the stack
• Code (with no error checking)
void preorderTraversal(Node root){
NodeStack stack = new NodeStack();
stack.push( root);
while (true) {
Node curr = stack.pop();
if (curr==null) break;
curr.printValue();
Node n= curr.getRight();
if (n!=null) stack.push(n);
n = curr.getLeft();
if (n!=null) stack.push(n);
}
}
• Algorithm outline:
Examine the current node
If value1 and value2 are both less than the current node
18 1.2. PROBLEMS ON TREES AND GRAPHS
• Code
3. You have a tree (not Binary) and you want to print the values of all
the nodes in this tree level by level.
If you want a simple algorithm, just take the 0-1 adjacency matrix and
calculate its N+1 power, if it is an N × N matrix. If the result is all
zeroes then there are no cycles. Otherwise there are.
• If the graph has no nodes, stop. The graph is acyclic.
• If the graph has no leaf, stop. The graph is cyclic.
• Choose a leaf of the graph. Remove this leaf and all arcs going
into the leaf to get a new graph.
• Go to 1.
7. In a general tree, how would you find the lowest common ancestor of
two nodes that are given to you as parameters?
8. If there are two structs, TreeNode and Tree. TreeNode contains 3
elements, data, lChild and rChild. Tree contains 2 elements, int size
and TreeNode *root. The tree is a complete tree. So how to find a
O(logN) approach to insert a new node.
9. Design an algorithm and write code to serialize and deserialize a binary
tree/graph
10. Given two binary trees, find whether or not they are similar.
11. Given a binary tree, write code to check whether it is a binary search
tree or not.
12. Design a graph class. Write the C++ interface for it.
13. Given a binary tree, convert it into a doubly linked list in place.
14. Given a binary tree with nodes, print out the values in pre-order/in-
order/post-order without using any extra space.
15. Write a function to find the depth/width of a binary tree.
16. How do you represent an n-ary tree? Write a program to print the
nodes of such a tree in breadth first order.
17. Implement a breadth first traversal of a (binary) tree.
18. Find the n-th node in an in-order search of a tree.
19. Given a binary tree with the following constraints: a) A node has either
both a left and right child OR no children b) The right child of a node
is either a leaf or NULL. write code to invert this tree.
20. What is a balanced tree?
20 1.3. STRING MANIPULATION PROBLEMS
• Algorithm outline:
First, build the character count hash table:
For each character
If no value is stored for the character. store 1
Otherwise, increment the value
Second, scan the string:
For each character
Return character if count in hash table is 1
If no characters have count 1, return null
• Code
public static Character fiestNonRepeated (String str)
{
Hashtable charHash = new HashTable();
int i, length;
Character c’
Object seenOnce = new Object();
Object seenTwice = new Object();
length = str.length();
//Scan str, building hash table
for (i=0; i< length; i++) {
c = new Character(str.charAt(i));
Object o = charHash.get(c);
if (o==null) {charHash.put(c, seenOnce);}
else if (o==seenonce) {
charHash.put(c, seenTwice);
}
}
for (i=0; i< length; i++){
c = new Character(str.charAt(i));
if (charHash.get(c) == seenOnce)
return c;
http://www.spellscroll.com 21
}
return null;
}
A (significantly) further speedup could be achieved by implement-
ing a faster char to Character mapping, possibly using an array to
cache the mappings, or at least the most frequent mapping (such
as for ASCII characters). Or use a hash table implementation that
could directly store character char values.
where any character existing in remove must be deleted from str. Jus-
tify any design decisions you make and discuss the efficiency of your
solution.
3. [Reverse Words] Write a function that reverses the order of the words
in a string. For example, your function should transform the string “Do
or do not, there is no try.” to “try. no is there not, do or Do”. Assume
that all words are space delimited and treat punctuation the same as
letters.
9. Write a function that returns the longest run of a letter in a string. e.g.
“cccc” in the string “abccccdef”.
10. Write an atoi() function for decimal. Once this was done, generalize it
for any radix.
13. Write a function that returns the longest palindrome in a given string.
e.g “ccddcc” in the string “abaccddccefe”.
which takes a telephone key (0-9) and a place of either 1,2,3 and re-
turns the character corresponding to the letter in that position on the
specified key.
24 1.5. PROBLEMS ON SEARCHING AND SORTING
5. How to find the two numbers whose difference is minimum among the
set of numbers.
21. Given a file containing approx 10 million words, Design a data structure
for finding all the anagrams in that set.
3. How could a linked list and a hash table be combined to allow someone
to run through the list from item to item while still maintaining the
ability to access an individual element in O(1) time?
4. Shuffling
/*
* get_shuffle --
* Construct a random shuffle array of t elements
*/
static size_t * get_shuffle(size_t t) {
size_t *shuffle;
size_t i, j, k, temp;
/*
* This algorithm is taken from D. E. Knuth,
* The Art of Computer Programming, Volume 2:
* Seminumerical Algorithms, 2nd Ed., page 139.
*/
temp = shuffle[j];
shuffle[j] = shuffle[k];
shuffle[k] = temp;
}
return shuffle;
}
28 1.6. MISCELLANEOUS PROBLEMS
Bibliography