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

题目描述:

给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。

如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。

实例:

输入:1
输出:true
输入:24
输出:false
输入:46
输出:true (: 46不是2的幂,将4和6重新排序得到64, 64为2的幂,所以返回True)

思路解析:

本文可以从两个方面进行考虑

1.判断一个数字是否是2的幂。

2.把数字进行字符串转换,然后进行排列组合,可以考虑使用递归。

代码:

def isPowerOfTwo(n: int) -> bool:

    return (n & (n - 1)) == 0

class Solution:

    def reorderedPowerOf2(self, n: int) -> bool:

        nums = sorted(list(str(n)))

        m = len(nums)

        vis = [False] * m

        def backtrack(idx: int, num: int) -> bool:

            if idx == m:

                return isPowerOfTwo(num)

            for i, ch in enumerate(nums):

                # 不能有前导零

                if (num == 0 and ch == '0') or vis[i] or (i > 0 and not vis[i - 1]      

                    and    ch == nums[i - 1]):

                    continue

                vis[i] = True

                if backtrack(idx + 1, num * 10 + ord(ch) - ord('0')):

                    return True

                vis[i] = False

            return False

        return backtrack(0, 0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值