(Paper) Microsoft Interview Pattern (Page-8)
Interview :Microsoft Interview Pattern (Page - 8)
Linked lists
86. Under what circumstances can one delete an element from a singly
linked list in constant time?
ANS. If the list is circular and there are no references to the nodes
in the list from anywhere else! Just copy the contents of the next node
and delete the next node. If the list is not circular, we can delete
any but the last node using this idea. In that case, mark the last node
as dummy!
87. Given a singly linked list, determine whether it contains a loop
or not.
ANS.
(a) Start reversing the list. If you reach the head, gotcha! there
is a loop!
But this changes the list. So, reverse the list again.
(b) Maintain two pointers, initially pointing to the head. Advance one
of them one node at a time. And the other one, two nodes at a time. If
the latter overtakes the former at any time, there is a loop!
p1 = p2 = head;
do {
p1 = p1->next;
p2 = p2->next->next;
} while (p1 != p2);
88. Given a singly linked list, print out its contents in reverse
order. Can you do it without using any extra space?
ANS. Start reversing the list. Do this again, printing the contents.
89. Given a binary tree with nodes, print out the values in
pre-order/in-order/post-order without using any extra space.
90. Reverse a singly linked list recursively. The function prototype is
node * reverse (node *) ;
ANS.
node * reverse (node * n)
{
node * m ;
if (! (n && n -> next))
return n ;
m = reverse (n -> next) ;
n -> next -> next = n ;
n -> next = NULL ;
return m ;
}
91. Given a singly linked list, find the middle of the list.
HINT. Use the single and double pointer jumping. Maintain two pointers,
initially pointing to the head. Advance one of them one node at a time.
And the other one, two nodes at a time. When the double reaches the
end, the single is in the middle. This is not asymptotically faster but
seems to take less steps than going through the list twice.
Bit-manipulation
92. Reverse the bits of an unsigned integer.
ANS.
#define reverse(x) \
(x=x>>16|(0x0000ffff&x)<<16, \
x=(0xff00ff00&x)>>8|(0x00ff00ff&x)<<8, \
x=(0xf0f0f0f0&x)>>4|(0x0f0f0f0f&x)<<4, \
x=(0xcccccccc&x)>>2|(0x33333333&x)<<2, \
x=(0xaaaaaaaa&x)>>1|(0x55555555&x)<<1)
93. Compute the number of ones in an unsigned integer.
ANS.
#define count_ones(x) \
(x=(0xaaaaaaaa&x)>>1+(0x55555555&x), \
x=(0xcccccccc&x)>>2+(0x33333333&x), \
x=(0xf0f0f0f0&x)>>4+(0x0f0f0f0f&x), \
x=(0xff00ff00&x)>>8+(0x00ff00ff&x), \
x=x>>16+(0x0000ffff&x))
94. Compute the discrete log of an unsigned integer.
ANS.
#define discrete_log(h) \
(h=(h>>1)|(h>>2), \
h|=(h>>2), \
h|=(h>>4), \
h|=(h>>8), \
h|=(h>>16), \
h=(0xaaaaaaaa&h)>>1+(0x55555555&h), \
h=(0xcccccccc&h)>>2+(0x33333333&h), \
h=(0xf0f0f0f0&h)>>4+(0x0f0f0f0f&h), \
h=(0xff00ff00&h)>>8+(0x00ff00ff&h), \
h=(h>>16)+(0x0000ffff&h))
If I understand it right, log2(2) =1, log2(3)=1, log2(4)=2..... But
this macro does not work out log2(0) which does not exist! How do you
think it should be handled?
95. How do we test most simply if an unsigned integer is a power of
two?
ANS. #define power_of_two(x) \ ((x)&&(~(x&(x-1))))
96. Set the highest significant bit of an unsigned integer to zero.
ANS. (from Denis Zabavchik) Set the highest significant bit of an
unsigned integer to zero
#define zero_most_significant(h) \
(h&=(h>>1)|(h>>2), \
h|=(h>>2), \
h|=(h>>4), \
h|=(h>>8), \
h|=(h>>16))
97. Let f(k) = y where k is the y-th number in the increasing sequence
of non-negative integers with the same number of ones in its binary
representation as y, e.g. f(0) = 1, f(1) = 1, f(2) = 2, f(3) = 1, f(4) =
3, f(5) = 2, f(6) = 3 and so on. Given k >= 0, compute f(k).
Others
98. A character set has 1 and 2 byte characters. One byte characters
have 0 as the first bit. You just keep accumulating the characters in a
buffer. Suppose at some point the user types a backspace, how can you
remove the character efficiently. (Note: You cant store the last
character typed because the user can type in arbitrarily many backspaces)
99.
What is the simples way to check if the sum of two unsigned
integers has resulted in an overflow.
100. How do you represent an n-ary tree? Write a program to print the
nodes of such a tree in breadth first order.
101. Write the 'tr' program of UNIX. Invoked as
tr -str1 -str2. It reads stdin and prints it out to stdout, replacing
every occurance of str1[i] with str2[i].
e.g. tr -abc -xyz
to be and not to be <- input
to ye xnd not to ye <- output

Daily JOBS





