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

该博客讨论了如何确定一个整数是否可以通过重新排序其数字来形成2的幂。提出了两种思路,一是检查数字是否本身就是2的幂,二是通过回溯算法遍历所有可能的数字排列。提供的代码实现中,首先判断给定数字是否为2的幂,然后使用回溯法尝试所有可能的排序,如果找到一种排序使得排序后的数字是2的幂,则返回true,否则返回false。

题目描述:

给定正整数 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值