【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

猜你喜欢

转载自blog.csdn.net/sinat_39400781/article/details/81150421