A unique number can be defined as a positive integer without leading zeros, in which each digit occurs only once (no duplicate digit). There can be various methods to de
tect whether or not a given positive integer is a unique number or not. I won’t be discussing methods which requires the number to be converted into a string as that would be inefficient in terms of space and time.
The approach which I am going to demonstrate in this post is to use a single short (integer) variable to store the presence(or absence) of each digit of an integer instead of multiple flags or an array. Note that a short variable consist of 16 bits (i.e. binary digit 0 or 1) and in this case we only need 10 bits to store the presence (or absence) of each digit. The idea is to read a bit corresponding to the required digit, if it is already 1 that means that the digit is repeated and false is returned. If the bit read is 0 then it is set as 1 to denote the presence of that particular digit. The last digit is for 0, the second last bit is for digit 1 and so on.
The java program to implement the above mentioned logic for unique number is as follows:
class UniqueNumber{
public static boolean isUniqueNumber( int n ){
short status=0;
byte digit;
for( int temp=n; temp>0; temp/=10 ){
digit=(byte)(temp%10);
if( (status & (1<<(digit))) >0 ) return false;
else status |= 1<<(digit);
}
return true;
}
public static void main( String args[] ){
System.out.println(isUniqueNumber(1234)); //1234 is a unique number
System.out.println(isUniqueNumber(12342));//12342 is not a unique number
}
}
The output of the above program to ascertain the unique number would be as follows:
true false
The expression
1<<(digit)
is for shifting 1 towards the left for required number of bits. For example, if digit is 0 the expression it would remain 0, if digit is 1 the expression would result in 10, if digit is 2 the expression would result in 100 and so on.
The expression
status & (1<<(digit))
is for extracting the required bit from the variable status. Note that a.1=1 according to boolean algebra.
The expression
status |= 1<<(digit)
is a short-hand for
status = status | 1<<(digit)
The purpose of the above line is to set a particular bit because a+1=1 according to boolean algebra.