LeetCode-每日一题 869. 重新排序得到 2 的幂 [Java实现]

给定正整数N,判断通过重新排序能否得到2的幂。文章提供了两种方法:穷举所有2的幂并排序后与N排序后的形式比较,以及对N的所有可能排列进行全排列检查。全排列过程中注意首位不能为0和重复数字的情况。
摘要由CSDN通过智能技术生成

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

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

示例 1

输入:1
输出:true

提示:

  1. 1 <= N <= 10^9

方法一:穷举

        由提示可知给定的 N 在int型范围内,那么对于最取巧的方法来说,不妨在开始就枚举完所有的 2^n 的值并将位数从小到大进行排序(如 512 -> 125),在输入数值时也进行相同的位数排序处理并直接与先前储存的结果进行比较,直接可的解。

方法二:全排列

        那么对于像博主这样的老实人,当然是全排列所有可能的结果并利用二进制特性一一进行位运算检验合法性,其中需要特别注意的是全排列的剪枝判定:

  • 当该枚举数在本次排列中被使用过时跳过(废话
  • 当处于首位且枚举数为0时跳过
  • 当当前枚举数与前一项数相同,且前一项数未被使用时(此情况下相当于由两个相同的枚举项竞争同一待填位数)

        为了确保第三点能够成功执行,我们需要将输入的数字进行排序,而又因为我们进行了全排列来检索所有可能性所以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值