Leetcode刷题c++之869. 重新排序得到 2 的幂

题目描述:

给定正整数 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。
此思路来源:力扣

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值