从正整数 N 开始,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。

如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false

 

示例 1:

输入:1
输出:true

示例 2:

输入:10
输出:false

示例 3:

输入:16
输出:true

示例 4:

输入:24
输出:false

示例 5:

输入:46
输出:true

 

提示:

  1. 1 <= N <= 10^9

 

思路:

1.在10^9次方以内,只有32个数是2的幂 (分别位2^0, 2^1,...2^31)

 

public boolean reorderedPowerOf2(int N) {
        long c = counter(N);
        for (int i = 0; i < 32; i++)
            if (counter(1 << i) == c) return true;
        return false;
    }
    public long counter(int N) {        //对数字进行转换  对每一个数字都变成2的幂次和
        long res = 0;
        for (; N > 0; N /= 10) 
        	res += (int)Math.pow(2, N % 10);
        return res;
    }

另外补充,

怎么判断一个数是不是2的幂次,将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0; 因此问题可以转化为判断1后面是否跟了n个0就可以了。如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与去减去1后的数字进行与运算后会发现为零

可以使用位运算 & 判断

  (n & (n-1))== 0