leetcode869_重新排序得到2的幂
从正整数 N
开始,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true
;否则,返回 false
。
示例 1:
输入:1 输出:true
示例 2:
输入:10 输出:false
示例 3:
输入:16 输出:true
示例 4:
输入:24 输出:false
示例 5:
输入:46 输出:true
提示:
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