力扣--869. 重新排序得到 2 的幂(中等题)
这题用暴力太复杂了, 看了题解发现一个好方法,所以做个笔记。
原题传送门
【题目描述】
给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
【示例】
示例 1:
输入:1
输出:true
示例 2:
输入:10
输出:false
示例 3:
输入:16
输出:true
示例 4:
输入:24
输出:false
示例 5:
输入:46
输出:true
提示:
1 ≤ N ≤ 1 0 9 1 \le N \le 10^9 1≤N≤109
【比较数字的组成是否一致】
【思路】
这道题涉及到了排列组合,暴力的话比较复杂,但是也有一个比较简单的方法:
排列组合之后再判断能否组成某种数字,那么只需要判断它的各个位上的数字组成与目标是否一致。如:12345和52134这两个数,数字的组成是一样的,经过排列,52134可以变成12345,类似这样的思路,可以写出代码。
【代码】
class Solution {
public:
bool reorderedPowerOf2(int n) {
int* nums=new int[32];
long long t=n;
int* m=countn(t);//n的数字组成,格式[0,1,0,0,0,0,0,0,0,0]表示1,[0,2,1,0,0,0,0,0,0,0]表示112
int flag=0;
for(int i=0;i<32;i++){
nums=countn(pow(2,i));//2的幂的数字组成
flag=0;
for(int j=0;j<10;j++){//比较
if(nums[j]!=m[j]){
flag=1;
break;
}
}
if(flag==0){//一致,返回true
return true;
}
}
return false;
}
int* countn(long long n){//将数字转换成统计数字组成的数组。用long long是因为算2^32的时候int会溢出
int* cnt=new int[10];
for(int i=0;i<10;i++){
cnt[i]=0;
}
while(n>=1){
cnt[n%10]++;
n=(n-n%10)/10;
}
return cnt;
}
};