重新排序得到 2 的幂
给定正整数 n ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
示例 1:
输入:n = 1 输出:true
示例 2:
输入:n = 10 输出:false
这题最好的方法还是应该用dfs遍历全排列,然后进行检查是否是2的幂,即可解出,dfs使处理全排列的一种非常好的办法。
int flag;
bool jud(int a){
int flag=0;
while(a>0){
if(a&1==1){
if(flag==1){
return false;
}
flag=1;
}
a >>= 1;
}
return true;
}
void search(int* a,int sum,int now,int* judge,int* m){
if(flag==1){
return;
}
int i;
if(now==sum){
int num=0;
for(i=0;i<sum;i++){
num*=10;
num+=m[i];
}
if(jud(num)==1){
flag=1;
}
return;
}
for(i=0;i<sum;i++){
if(judge[i]==1||(now==0&&a[i]==0)){
continue;
}
m[now]=a[i];
judge[i]=1;
search(a,sum,now+1,judge,m);
judge[i]=0;
}
return;
}
bool reorderedPowerOf2(int n){
int a[20];
int sum=0;
flag=0;
while(n>0){
a[sum++]=n%10;
n /= 10;
}
int m[sum];
int judge[sum];
memset(judge,0,sizeof(int)*sum);
search(a,sum,0,judge,m);
return flag==1;
}
|