-
题目:
给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。 如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
-
示例 1:
输入:1 输出:true
-
示例 2:
输入:10 输出:false
-
示例 3:
输入:16 输出:true
-
示例 4:
输入:24 输出:false
-
示例 5:
输入:46 输出:true
-
提示
1 <= N <= 10^9
思路 :
- 方法一:列出该数字所有组合,然后判断这个数字是不是2的次幂。复杂度过高
- 方法二:先列出109内2的所有次幂并将每个数字从大到小排序,将输入的值也按照相同的规则处理,直接判断是否在前面列出来的set中即可。(也可以使用其他规则处理,如统计每个数字出现的次数)
示例一:
class Solution {
public boolean reorderedPowerOf2(int n) {
int num = 1;
Set<String> set = new HashSet<>();
set.add("1");
// 判断是否溢出
while (num == num << 1 >> 1) {
num = num << 1;
set.add(intSort2String(num));
}
return set.contains(intSort2String(n));
}
/**
* 将数字从大到小排序再转成字符串
*
* @param num
* @return
*/
private String intSort2String(int num) {
char[] nums = String.valueOf(num).toCharArray();
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums.length - 1 - i; j++) {
if (nums[j] < nums[j + 1]) {
char t = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = t;
}
}
}
return String.valueOf(nums);
}
}