本文主要是介绍【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
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: # 判断首个数字不为0if item[0] != "0":# 组合为新的排列形式数字new_str = ""for i in item:new_str += inum = int(new_str)if num & (num-1) == 0:flag = Truebreak# 输出结果return flag
这篇关于【Leetcode】869. 重新排序得到 2 的幂的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!