题目:
从正整数 N 开始,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
示例 1:
输入:1 输出:true
示例 2:
输入:10 输出:false
示例 3:
输入:16 输出:true
示例 4:
输入:24 输出:false
示例 5:
输入:46 输出:true
提示:
1 <= N <= 10^9
分析:
这道题就是最基础的全排列的应用,还有就是快速判断2的幂,一个数为2的幂,就是二进制数只能有一个1,比如32(0x00000010), 所以判断条件就是n & (n-1) 为零。之后就是全排列的算法,这个算法是固定的,多敲就记住了,还有一个坑,就是前导零不算,这样把第一位为零的数去掉即可。
代码:
class Solution {
public:
bool reorderedPowerOf2(int N) {
vector<int> bit;
string s = to_string(N);
int len = s.size();
bool state = false;
int cnt = 0;
dfs(s,0,len, cnt);
if(cnt)
return true;
return false;
}
void dfs(string &str, int i, int len, int &cnt){
if(i == len){
if(str[0] == '0'){
return;
}
else{
int num = stoi(str);
if((num &(num-1)) == 0){
cnt++;
return;
}
}
}
else{
for(int j = i ; j < len; j++){
swap(str[j], str[i]);
dfs(str, i+1, len, cnt);
swap(str[j], str[i]);
}
}
}
};
本文介绍一种算法,用于判断一个正整数N通过重新排列其数字后是否可以成为2的幂。该算法利用了二进制位运算的特点,并通过全排列的方式检查所有可能的数字组合。
242

被折叠的 条评论
为什么被折叠?



