【LeetCode每日一题】 869. 重新排序得到 2 的幂



题目
 

给定正整数 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



一、解题思路

  1. 写一个求数值中数字个数的函数,求N中数字个数,以及求2的次幂的个数用
  2. 不断在循环累加2的次幂值,长度不一样的直接进入下一个2的次幂比较
  3. 利用一个数组索引对应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;
}


总结

利用数组索引的方法比较巧妙,且大大节省了空间利用,和运行速度。

打开第二天,坚持坚持 加油加油!!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值