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

该博客探讨了一种编程问题,其中涉及对正整数的所有可能排列进行检查,以确定是否存在一种排列能形成2的幂。文章通过结合全排列和2的幂的判断算法,提供了一个解决方案。首先,使用深度优先搜索实现全排列(去除重复和前导零),然后将排列转换为整数并判断是否为2的幂。最后,通过示例代码展示了整个过程。

题目描述

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

如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
在这里插入图片描述
在这里插入图片描述

思路

这题的思路结合了
leetcode-47.全排列-Ⅱ
leetcode-231.2的幂
所以,建议先把这两题做了
做完后会发现,这题的解题思路就是:
对于给定整数N,我们可以对其进行全排列(去重,去前导数字为0),然后对结果集的每个排列结果,进行判断是否为2的幂。

代码实现(py3)

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

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

 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reordered-power-of-2
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
"""
# 判断N是否为2的幂
def is_power(N):
    if N <= 0:
        return False
    check = 0
    while(N > 1):
        if N==2:
            break
        N /= 2
        check = N%2
    return check == 0


# 深度优先搜索
def dfs(nums, depth, path, used, res):
    # 已经到了叶子节点
    if(depth == len(nums)):
        res.append(path.copy())
        return
    for i in range(len(nums)):
        if used[i] or (i > 0 and used[i - 1] == False and nums[i] == nums[i - 1]):
            continue
        # 还没被选过
        path.append(nums[i])
        used[i] = True
        dfs(nums, depth + 1, path, used, res)
        # 回溯
        path.pop()
        used[i] = False
# 全排列(去重)
def permuteUnique(nums):
    path = []
    used = []
    depth = 0
    res = []
    for _ in range(len(nums)):
        used.append(False)
    if len(nums) == 0:
        return res
    nums.sort()
    dfs(nums, depth, path, used, res)
    return res
    
# list转为int
def cover2_int(nums):
    nums.reverse()
    n = 0
    res = 0
    for i in nums:
        res += i * pow(10, n)
        n += 1
    return res

# int转为list
def cover2_list(n):
    res = []
    while n:
        res.append(n%10)
        n //= 10
    res.reverse()
    return res

class Solution:
    def reorderedPowerOf2(self, n):
        can_get = False
        nums = cover2_list(n)
        res = permuteUnique(nums)
        for item in res:
            if item[0] == 0:
                continue
            if is_power(cover2_int(item)):
                return True
        return can_get

内容概要:本文档《数据安全作战地图-图谱四合一.pdf》围绕“数据在流动,可见才安全”的核心理念,详细阐述了数据安全的演进和重要性,强调了全链路数据流动安全的重要性。文档介绍了数据流动中的风险分布,如数据采集、传输、存储、使用等环节的风险,并提出了构建全域数据流动链路的重要性。文档还探讨了数据安全的建设基础,包括数据资产盘点、数据分类分级、数据流动测绘、主动风险评估、动态风险监测等关键步骤。此外,文档强调了数据安全风险评估的重要性,提出了评估流程和方法,并介绍了数据接口风险监测的具体措施和技术手段。适用人群:适用于企业信息安全管理人员、数据安全工程师、IT架构师、合规管理人员等,尤其是对数据安全建设和风险评估有需求的专业人士。使用场景及目标:①帮助企业理解数据流动的安全风险,提升数据安全意识;②指导企业构建全链路数据流动安全体系,实现数据安全的可见、可知、可管;③提供数据安全风险评估的具体方法和工具,帮助企业识别和应对潜在风险;④介绍数据接口风险监测的技术和流程,确保数据接口的安全性和合规性。其他说明:文档不仅提供了理论指导,还结合了实际案例,展示了数据安全建设的最佳实践。建议读者结合自身业务特点,灵活运用文档中的技术和方法,以提升企业的数据安全防护能力。文档强调了数据安全建设的持续性和动态性,鼓励企业定期进行风险评估和安全审查,以适应不断变化的业务环境和技术挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值