题目
给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
示例 1:
输入:1
输出:true
示例 2:
输入:10
输出:false
示例 3:
输入:16
输出:true
示例 4:
输入:24
输出:false
示例 5:
输入:46
输出:true
提示:
1 <= N <= 10^9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reordered-power-of-2
一、解题思路
- 写一个求数值中数字个数的函数,求N中数字个数,以及求2的次幂的个数用
- 不断在循环累加2的次幂值,长度不一样的直接进入下一个2的次幂比较
- 利用一个数组索引对应0-9的10个数字,数组中所有值设为0,对2的次幂中每个数字存在就在数组对应索引中的值+1,N中每个数字存在就在数组对应索引中-1,最后判断数组是否全为零。
二、结果
1.注意点
- 数字个数不一样可直接结束
- 利用数组索引对应0-9的10个数字
2.C代码
代码如下(示例):
#include <math.h>;
bool aa(int N,int count,int length);
int getlength(long N){ //求N中数字个数
int length=0;
while(N!=0){
N/=10;
length++;
}
return length;
}
bool reorderedPowerOf2(int N){
int length=getlength((long)N);
for(int i=0;i<32;i++){
if(aa(N,i,length)) return 1;
}
return 0;
}
bool aa(int N,int count,int length){
long b=pow(2,count);
int len=getlength(b);
if(len!=length) return 0; //数字个数不一样直接结束
int dp[10]; //建立存放0-9的数组
for(int i=0;i<10;i++) dp[i]=0; //数组值都设为0
while(b!=0){
dp[b%10]++; //2的次幂中每个数字存在就在数组对应索引中+1
b/=10;
}
int a=N;
while(a!=0){
dp[a%10]--; //N中每个数字存在就在数组对应索引中-1
a/=10;
}
for(int i=0;i<10;i++){
if(dp[i]!=0) return 0; //判断数组是否全为零
}
return 1;
}
总结
利用数组索引的方法比较巧妙,且大大节省了空间利用,和运行速度。
打开第二天,坚持坚持 加油加油!!!!!