LeetCode 869. 重新排序得到 2 的幂
给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
示例 1:
输入:1
输出:true
class Solution {
public:
bool reorderedPowerOf2(int n) {
string nums = to_string(n);
sort(nums.begin(), nums.end());//不能重复排列,所以要排序,判断前后值是否相等
vector<bool> vis(nums.size());//标记访问过的
return dfs(nums, 0, vis, 0);
}
bool dfs(string &nums, int index, vector<bool> &vis, int num){
if(index == nums.size()) {//字符串长度加一的时候遍历结束
return isPowerOfTwo(num);
}
for(int i=0; i < nums.size(); i++){
//访问过的跳过
//第一位为0时跳过
//不重复判断,剪枝,如果当前数与前一个数一样并且那个数未被访问过,则相同跳过
if(vis[i] || (nums[i] == '0' && num == 0) || (i > 0 && nums[i] == nums[i-1] && !vis[i-1]))
continue;
vis[i] = true;
if(dfs(nums, index+1, vis, num*10 + nums[i]-'0'))
return true;
vis[i] = false;
}
return false;
}
bool isPowerOfTwo(int n){//判断是否是2的幂次方
return n>0 && (n & n-1)== 0;//一定要加括号,符号计算优先级
}
};