小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目
给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
示例
输入: 1
输出: true
输入: 10
输出: false
输入: 16
输出: true
输入: 24
输出: false
输入: 46
输出: true
提示
1 <= N <= 10^9
解题思路
哈希预处理
在提示中有限定了数值N的范围在[1,10^9]之间,那么我们可以先做一个预处理,将该区间内所有2的幂进行拆分,统计各位数值的数量,然后保存到哈希表中。
由于题目中说明可以按照任意的顺序,那么我们可以将N拆分成[0,9]十位元素,分别统计每一位元素出现的个数,只要其个数与哈希表中已存在的数值个数相等,那么我们就可以通过排序将其排列成为2的幂。
class Solution {
// 哈希表记录所有2的幂组合
static Set<String> set = new HashSet<>();
// 预处理,将区间[1,10^9]中数字的各位数字进行统计
static {
for(int i = 1; i <=1e9; i <<= 1){
set.add(countDigits(i));
}
}
// 统计每一位数字出现的个数,转换成String类型保存到哈希表中
public static String countDigits(int i){
char[] cnt = new char[10];
while(i > 0){
++cnt[i % 10];
i /= 10;
}
return new String(cnt);
}
public boolean reorderedPowerOf2(int n) {
// 返回结果
return set.contains(countDigits(n));
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!