题目描述
给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
测试用例
示例 1:
输入:1
输出:true
示例 2:
输入:10
输出:false
示例 3:
输入:16
输出:true
提示:
1 <= N <= 10^9
解题思路
此处有个重要知识点,即:如果两个十进制数从大到小重新排序后,其结果相同,则对于它们能否排列出2的幂,答案是相同的。
由题意可知,在提示范围内,共有30个2的幂数,那么只要将给定的正整数 N 排序后与这30个数比较,如果有相同的排序,那么 N 也可以重排出2的幂数。
string countDigits(int n) {
string cnt(10, 0);
while (n) {
++cnt[n % 10];
n /= 10;
}
return cnt;
}
unordered_set<string> powerOf2Digits;
int init = []() {
for (int n = 1; n <= 1e9; n <<= 1) {
powerOf2Digits.insert(countDigits(n));
}
return 0;
}();
class Solution {
public:
bool reorderedPowerOf2(int n) {
return powerOf2Digits.count(countDigits(n));
}
};
复杂度分析
- 时间复杂度:O(\log n)O(logn)。统计 nn 的每个数字的出现次数需要 O(\log n)O(logn) 的时间。
- 空间复杂度:O(1)O(1)。