开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
869. 重新排序得到 2 的幂
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re…
给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
示例 1:
输入:1 输出:true
示例 2:
输入:10 输出:false
示例 3:
输入:16 输出:true
示例 4:
输入:24 输出:false
示例 5:
输入:46 输出:true
提示:
1 <= N <= 10^9
解法
- 全排列再加每个数判断
class Solution:
def reorderedPowerOf2(self, n: int) -> bool:
res = []
if n == 1:
return True
total_arrange = self.quan_pailie(str(n), res)
for s in total_arrange:
if s.startswith('0'): # 移除0开头的元素
continue
num = int(s)
if num & (num-1) == 0: # 判断是否是2的幂
return True
return False
def quan_pailie(self, s, res=[]): # 递归求全排列
if not s:
return []
if len(s) == 1:
return [s]
res = []
visited = set()
for i, item in enumerate(s):
if item in visited:
continue
visited.add(item)
new_s = s[:i] + s[i+1:]
tmp = self.quan_pailie(new_s, [])
for v in tmp:
res.append(s[i]+v)
return res
- 解法二,哈希表+统计元素0-9出现个数+遍历
def countDigits(n: int) -> Tuple[int]:
cnt = [0] * 10
while n:
cnt[n % 10] += 1
n //= 10
return tuple(cnt)
powerOf2Digits = {countDigits(1 << i) for i in range(30)}
class Solution:
def reorderedPowerOf2(self, n: int) -> bool:
return countDigits(n) in powerOf2Digits
复杂度分析
- 时间复杂度: O(m!), O(logn)
- 空间复杂度: O(m), O(1)