【Leetcode】869. 重新排序得到 2 的冪
阿新 • • 發佈:2019-01-13
題目描述
從正整數 N
開始,我們按任何順序(包括原始順序)將數字重新排序,注意其前導數字不能為零。
如果我們可以通過上述方式得到 2 的冪,返回 true
;否則,返回 false
。
示例 1:
輸入:1 輸出:true
示例 2:
輸入:10 輸出:false
示例 3:
輸入:16 輸出:true
示例 4:
輸入:24 輸出:false
示例 5:
輸入:46 輸出:true
提示:
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