题目描述:
给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
示例1:
输入:24 输出:false
示例 2:
输入:46 输出:true
思路1:将输入的整数的先%10得到最后一位,再/10到循环结束,用一个大小为10的数组来存储该整数的每一位数字及其出现的次数,然后对这些数字进行循环重新组合。
依次判断组合后的整数是否是2的幂:
两种判断方法摘自判断一个数是不是2的整数次幂(两种方法)_Wang.T的博客-CSDN博客_判断一个数是不是2的整数次幂
(1)拿这个数来除以2,得到商和余数,再用商除以2,又得到商和余数,重复上面的操作,直到商为0,当商为0,余数也为0时,这个数就是2的整数次幂当商为0,余数不为0时,这个数就不是2的整数次幂。
(2)
将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0; 因此问题可以转化为判断1后面是否跟了n个0就可以了。
如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与去减去1后的数字进行与运算后会发现为零。
即:(number & number - 1) == 0
思路2:
第一步也是记录所输入整数的每一位及出现的次数。
第二步
对于所有的2的幂分别进行上述统计,存到一个vector<vector<int>>中,这里命名为is2mi。然后将输入的整数的统计结果,依次与is2mi中的所统计的多个结果进行比较,只要其中有一个结果与n统计的结果相同,那么就返回true。
具体举个例子:n=46时,统计其中的数字,则4出现1次,6出现1次,其余数字出现0次;依次遍历is2mi:1,2,4,8,16,32,当遍历到64时,发现64的统计结果也是4出现1次,6出现1次,其余数字出现0次,与n=46的统计结果相同,故返回true。
此思路来源:力扣