【Leetcode】869. 重新排序得到 2 的幂

题目描述

从正整数 N 开始,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。

如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false

 

示例 1:

输入:1
输出:true

示例 2:

输入:10
输出:false

示例 3:

输入:16
输出:true

示例 4:

输入:24
输出:false

示例 5:

输入:46
输出:true

提示:

  1. 1 <= N <= 10^9

AC思路:

求N的全排列,然后判断是否为2的幂(常用)。之前没想到用这种方法是觉得求全排列过于暴力,没想到C++中已经封装好了求排列的函数(python也有不过谜之超时了),于是采用即可。

其它思路(未验证):

由于N为int之内的数,不妨开一个10×32的数组,去记录2的对应1至32次幂中0-9中数字出现的次数,然后对于每个输入的数字N,去判断是否和10×32数组的某一列匹配,如果匹配则返回true,否则则返回false。(查看评测记录发现最快的似乎也是这种思路,不过直接用一维数组进行32次循环判断)

AC代码(c++版):

class Solution {
public:
    bool reorderedPowerOf2(int N) {
       
        vector<int>lis;
       
        while(N>0)
        {
        lis.push_back(N%10);
        N/=10;
        }
        sort(lis.begin(),lis.end());
       
        do
        {
            if(lis[0]==0)continue;
            int k=0;
            for(int i=0;i<lis.size();i++)
            {
                k=k*10+lis[i];
            }
            if(judge(k)==0)return true;
        } while((next_permutation(lis.begin(),lis.end())));
      
        return false;
    }
    bool judge(int N){
        return N&(N-1);
    }
};

超时的python代码(只是来熟悉一下操作。。):

import itertools
class Solution(object):
    def reorderedPowerOf2(self, N):
        """
        :type N: int
        :rtype: bool
        """
        # 将数字转化为列表
        list_num = list(str(N))
        # 数字进行任意组合
        term = list(itertools.permutations(list_num, len(list_num)))
        flag = False
        # 判断每个组合成的数字是否为2的幂
        for item in term: 
        # 判断首个数字不为0
            if item[0] != "0":
        # 组合为新的排列形式数字
                new_str = ""
                for i in item:
                    new_str += i
                num = int(new_str)
                if num & (num-1) == 0:
                    flag = True
                    break
        # 输出结果
        return flag

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值