Problem Statement
Implement the function boolean isPalindrome (int n);
Which will return true if the bit-wise representation of the integer
is a palindrome and false otherwise.
Motivation: This is a favorite interview question of Amazon guys.
Solution:
The idea is simple, we take two pointers one at leftmost bit and another at rightmost bit, extract bits information using the pointers both bits should either be 0 or 1. and move the pointers until they meet.
Now how would you extract the bit is tricky one, basically you first get number of bits in the integer and then shift 1 left by (number of bits -1) this will become our leftmost pointer and number 1 will be our rightmost pointer. Use & operator between original number and these pointers if the result is 0 then the corresponding bit is zero else(non-zero) then corresponding bit is 1.
Note: check for non-zero rather then > 0 as 1000000000000 will be negative.
Here is the java code to get the size of the integer
public int getSizeOfInteger(){ int size =1; int num =1; //shift the number untill it becomes negative(1 followed by 0's) while(num > 0){ num = num<<1; size++; } return size; }
Here is the java code to get if the bit representation of the number is palindrome or not
public boolean isPalindrome(int n){ int rightPointer =1; int leftPointer = 1<<(getSizeOfInteger()-1); int count = getSizeOfInteger()/2; while(count > 0){ //Checking if both bits are 0 or both are non-zero and then negate if( !(((n & leftPointer) != 0 && (n & rightPointer) != 0) || ( (n & leftPointer) == 0 && (n & rightPointer) == 0))){ return false;//Both bits are not same } count--; } return true; }
Facebook Comments
Shilpa says
can we do this que as..take the reverse of the no n dn compare if the reverse n original no are equal , then its a palindrome otherwise not…
puzzlersworld says
Yes that will also be correct, but it will be higher in complexity and space.