如何高效判断一个数是否是2的n次幂-菜鸟网络一面题

想不到菜鸟网络会这么快电面,一脸懵逼,一点准备都没,书也没看,算法也没看。惨兮兮,哭唧唧。

大概问了这些
1.索引的数据结构 
2.二叉树,b+树。
3.排序算法
4.经典算法了解多少
5.设计模式
6.如何高效判断一个数是否是2的n次幂=================================

觉得当时回答的不好,就回答取模这一种,而且并不高效,所以一查资料 才知道。。。。
 

一个数是否是2的幂次方,比较常用的是递归和移位运算进行判断。递归算法的思想很简单,就是不断的模上2去判断。 

如果一个数是2的幂,那么它的二进制表示中就只有一位1,例如:10000,1000,100等等。所以如果对数字1进行移位操作,总会在移到某个位的时候和这个数相等。这就是移位判断的思想。 

下面给出实现的代码,在实现中,还采用了第三种方式,因为二进制表示的2的幂次方数中只有一个1,后面跟的是n个0; 因此问题可以转化为判断1后面是否跟了n个0。如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与上(&)减去1后的数字,结果为零。 
      (num & num - 1) == 0 

public class TwoPower {  
  
    /** 
     * 递归算法实现 
     *  
     * @param num 
     * @return 
     */  
    static int is2Power(int num){  
        if(num < 2)  
            return -1;  
  
        if(num == 2){  
            return 1;  
        }else if(num % 2 == 0){  
            return is2Power(num / 2);  
        }else  
            return -1;  
    }  
      
    /** 
     * 位与判断,最快 
     *  
     * @param num 
     * @return 
     */  
    static int anotherIs2Power(int num) {  
        if(num < 2)  
            return -1;  
          
        if((num & num - 1) == 0 )  
            return 1;  
        else  
            return -1;  
    }  
      
    /** 
     * 移位判断 
     *  
     * @param num 
     * @return 
     */  
    static int binaryIs2Power(int num) {  
        if(num < 2)  
            return -1;  
          
        int temp = 1;  
        while (num > temp) {    
            temp <<= 1;    
        }    
      
        return temp == num ? 1 : -1;   
    }  

猜你喜欢

转载自blog.csdn.net/bilibili_/article/details/81206705
今日推荐