1. 程式人生 > >【Leetcode】869. 重新排序得到 2 的冪

【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