869. 重新排序得到 2 的幂
将输入的int转化为字符串
并对字符串进行排序
进行全排列,使用回溯的方法,注意防止重复的顺序出现
再判断是不是2的power
class Solution {
public:
vector<int> vis;
bool isPowerOfTwo(int n){
return (n & (n-1)) ==0;
}
bool backtrack(string &nums, int idx, int num){
if(idx == nums.length()){
return isPowerOfTwo(num);
}
for(int i=0;i<nums.length();++i){
if(num == 0 && nums[i] == '0' || vis[i] || (i>0) && !vis[i-1] && nums[i] == nums[i-1]){
continue;
}
vis[i] = 1;
if(backtrack(nums, idx +1, num*10 + nums[i] -'0')){
return true;
}
vis[i] = 0;
}
return false;
}
bool reorderedPowerOf2(int n) {
string nums = to_string(n);
sort(nums.begin(),nums.end());
vis.resize(nums.length());
return backtrack(nums,0,0);
}
};
预处理 + 哈希表
首先将2的次幂中出现的数字个数都依次保存下来,
再同级输入的n的出现的数字个数
判断有无这个数字个数,从而得出结果
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));
}
};