LeetCode: 869. 重新排序得到 2 的幂

41 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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)

参考