Thursday, June 28, 2012

Tournament League Schedule

How efficiently you can schedule matches between N teams where each team has to play once against other team. 


given 3 arrays, array a, array b, array c.
find all pairs where a[i] + b[j] = c[k]
a, b , c are sorted.
A matching quadratic solution is available on wiki, please visit this link:

Tuesday, June 26, 2012

Missing integer(s) in the array

You have given two array e.g.
A[] and B[].

Difference between two arrays that A[] have two additional numbers than B[].
both the array is randomized and not in order.  

We have to find out both the number in array A[] in most effcient way. Dont try to sort and compare as time complexity is nlogn. Need a faster solution.

Assume We have elements in array A are a0, a1, a2, ................an
And Array B are b0, b1, b2, b3.....................bn.

Now as per above condition all the elements of B already present with A.
So we can represent like A[] = B[]+ai+aj where ai and aj is the missing number.

Step1: XOR all the elements for A[] XOR B[]. So result will ai XOR aj as remaining elements will be removed by XOR. 

Step2: Now take any bit set in above result. Assume we have result in variable result. Any bit set in result will be either set in ai or aj. Can not be in both the variable.  Assume set bit is 5th bit.

0  0   0
0  1   1
1  0   1
1  1   0

Now divide both the array A and B around set bit .  Any element of A whose fifth bit is set will be placed in upper half of array and element whose fifth bit is not set will go in lower half of array.

Now A will look like below

{a1,a2,a5, a8,.....},{a3,a4,a6,a7,.....}
Same for array B

Now one unknown number will be in first half and another in second half.
Same done with array B will make sure above equation Afirst[]=Bfirst[]+ai and Asecond[]=Bsecond[]+aj still holds true.

Step3: Now XOR all the element for Afirst XOR Bfirst and result will be first unknown number.
            Repeat the same for second part of array and get the second unknown number.

Thursday, June 7, 2012

One way : Heap or Stack allocation

Took my time to find solution for this and it actually made me realize how much i have to learn.
Now question is how can we enforce the creation of objects whether on heap or stack.

Creating object on Heap only.
Make your destructor private and create a destroy function.
Class A
void destroy() { delete this; }

Now if you can not create your object:

A a; //error: 'A::~A()' is private
A  a = new A();

Great. Now all the objects will be allocated to heap only. Making destructor private a better choice than constructor as we don't know number of constructor so early in programming.

Creating object on stack

While i knew that it has to do something with operator new, but could not figure out how can i create object on stack and return the memory back to class initialization.

Though answer was simple, i had to google for that:

Overload operator new, new[], operator delete and delete[] and make them private ;)

class A
void *operator new(size_t size) { }
void * operator new[](size_t size) {}
void operator delete(void *p) {}
void operator delete[](void *p) {}

You can create the object like:

A a;//It will work.
A *a = new A();//Error