【2.3】回溯算法-重新排序得到 2 的幂

news2024/9/21 20:29:58

一、题目

        给定正整数N,我们按任何顺序(包括原始顺序)将 数字重新排序 ,注意其前导数字不能为零。 如果我们可以通过上述方式得到2的幂,返回 true;否则,返回false。

提示:   1 <= N <= 10^9

二、求解思路

        题目要求对一个正整数进行重排序,并检查重排后的数字是否为2的幂。由于在int范围内,数字的长度有限,我们可以将数字n分解成单个数字,并允许它们自由组合。例如,对于数字123,自由组合的结果如下:

1. 123
2. 132
3. 213
4. 231
5. 312
6. 321

        接下来,我们需要判断这些组合后的数字是否为2的幂。可以参考回溯算法模板来实现这一过程。

void backtrack(/* 原始参数 */) {
    // 终止条件(递归必须要有终止条件)
    if (/* 终止条件 */) {
        // 一些逻辑操作(可有可无,视情况而定)
        return;
    }
    for (int i = /* for循环开始的参数 */; i < /* for循环结束的参数 */; i++) {
        // 一些逻辑操作(可有可无,视情况而定)
        // 做出选择
        // 递归
        backtrack(/* 新的参数 */);
        // 一些逻辑操作(可有可无,视情况而定)
        // 撤销选择
    }
}

        因为有重复的数字,我们可以参照回溯算法解含有重复数字的全排列 II来对代码进行优化。

三、代码实现

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

bool isPowerOfTwo(int n) {
    return n > 0 && (n & (n - 1)) == 0;
}

bool backtrack(std::vector<char>& numChar, std::vector<bool>& visit, int index, int num) {
    if (index == numChar.size()) {
        return isPowerOfTwo(num);
    }
    for (int i = 0; i < numChar.size(); ++i) {
        if (num == 0 && numChar[i] == '0') {
            continue;
        }
        if (visit[i]) {
            continue;
        }
        if (i > 0 && numChar[i - 1] == numChar[i] && visit[i - 1]) {
            continue;
        }
        visit[i] = true;
        if (backtrack(numChar, visit, index + 1, num * 10 + numChar[i] - '0')) {
            return true;
        }
        visit[i] = false;
    }
    return false;
}

bool reorderedPowerOf2(int n) {
    std::string numStr = std::to_string(n);
    std::vector<char> numChar(numStr.begin(), numStr.end());
    std::sort(numChar.begin(), numChar.end());
    std::vector<bool> visit(numChar.size(), false);
    return backtrack(numChar, visit, 0, 0);
}

int main() {
    int n = 123; // 你可以修改这个值来测试不同的输入
    if (reorderedPowerOf2(n)) {
        std::cout << n << " can be reordered to a power of 2." << std::endl;
    } else {
        std::cout << n << " cannot be reordered to a power of 2." << std::endl;
    }
    return 0;
}

排序比较方法:

        这种比较好理解,就是先把 数字转化为数组比如numChar ,然后再把int范围内所有 2 的幂也转化为数组,然后判断numChar和2的幂转化的数组是否一样。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

bool reorderedPowerOf2(int n) {
    // 先把数字转化为字符
    std::string numStr = std::to_string(n);
    std::vector<char> numChar(numStr.begin(), numStr.end());
    // 对字符进行排序
    std::sort(numChar.begin(), numChar.end());

    for (int i = 0; i < 31; i++) {
        // 把2的幂转化为字符,然后排序
        std::string bitStr = std::to_string(1 << i);
        std::vector<char> bitChar(bitStr.begin(), bitStr.end());
        std::sort(bitChar.begin(), bitChar.end());

        // 比较这两个数组
        if (numChar == bitChar) {
            return true;
        }
    }
    return false;
}

int main() {
    int n = 123; // 你可以修改这个值来测试不同的输入
    if (reorderedPowerOf2(n)) {
        std::cout << n << " can be reordered to a power of 2." << std::endl;
    } else {
        std::cout << n << " cannot be reordered to a power of 2." << std::endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2037980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习记录第二十六天

进程运行 1&#xff0c;子进程和父进程做相同的事----创建子进程 执行任务 2&#xff0c;子进程做与父进程不同的事 ----fork exec exec族 l VS v :主要是第二个参数的传参方式不同 p :表示寻找可执行文件 是通过PATA环境变量 e : 表示可以给…

升级软文发稿开源系统源码论文期刊一键发布

升级软文发稿运营管理源码—论文期刊一键发布 软文发稿系统源码&#xff08;软文发布系统&#xff09;在基于旧版本的媒介软文发布平台项目改造升级了新的功能模块简称&#xff08;3.0版&#xff09;本系统还是基于开源的PHPMYSQLlayui&#xff08;前端界面&#xff09;代码进行…

唐山网站建设方案优化

唐山作为一个重要的工业城市&#xff0c;网站建设在这里具有重要的意义。为了更好地服务于市民和企业&#xff0c;唐山网站建设方案需要不断优化和更新。下面将从内容、技术和设计三个方面来探讨唐山网站建设方案的优化。 首先是内容方面。唐山作为一个历史悠久且拥有丰富文化底…

如何提高遭受网络攻击后的恢复速度

现实促使组织探索提供更快恢复和增强安全性的替代网络保护和恢复方法&#xff0c;尤其是在更严格的法规驱动下&#xff0c;这种紧迫感愈加明显。以下是一些提高网络安全策略恢复速度的方法。 近年来&#xff0c;勒索软件攻击已成为一个重大且令人担忧的趋势&#xff0c;其频率和…

Spring之最基础的创建与Bean的存储与获取(还有Maven加载jar包报错的解决方法)

目录 创建Spring项目 如何解决Maven加载jar包报错 存储Bean和取Bean 在Java中对象也称为Bean。所以后面我提到Bean&#xff0c;大家要知道我说的是什么。 创建Spring项目 我的idea是2022版本的&#xff0c;如果大家和我一样可以参考我的。 1.创建一个Maven项目。图片上忘了…

【TiDB】08-离线部署TiDB 8.1

目录 1、环境检查 1.1、检测及关闭系统 swap 1.2、设置TiDB节点的临时空间 1.3、安装NTP服务 1.3.1、更新apt源 1.3.2、安装NTP 1.3.3、将本机作为NTP服务器 1.3.4、客户端连接 1.4、配置SSH互信及sudo免密码 2、离线安装 2.1、下载离线安装包 2.2、解压安装 2.3、…

YOLOv8改进 | 主干网络 | 动态调整目标的感受野的LSKNet【旋转目标检测SOTA】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

程序员最常用的操作——git

软件安装 官方下载&#xff08;比较慢&#xff09;&#xff1a;https://git-scm.com/downloads gitee 注册账号 https://gitee.com/ 新建仓库 honey2024 先全局配置下邮箱 配置 git config --global user.email “your_emailexample.com” git config --global user.name…

虚幻5|AI行为树,进阶篇

一&#xff0c;打开敌人的角色蓝图&#xff0c;编写以下蓝图&#xff0c;该蓝图只是创建一个敌人并非ai行为树 1.编写蓝图 2.打开主界面&#xff0c;创建一个导航网格体积&#xff0c;上一章都有讲&#xff0c;在添加体积这里面&#xff0c;找到导航网格体积&#xff0c;点击创…

安装buf工具和环境变量

安装buf工具和环境变量 下载buf的可执行文件&#xff1a; 访问buf官方的GitHub releases页面。 没梯子的就用csdn下载吧 https://download.csdn.net/download/qq_27229113/89638643 找到最新版本的buf。 在Assets部分&#xff0c;下载适合Windows的二进制文件&#xff0c;一…

如何利用宝塔给WordPress网站搬家?详细分步教程

对于使用WordPress建站的站长来说&#xff0c;网站搬家是一项必备技能。无论是重装系统、升级配置还是服务器迁移&#xff0c;掌握网站搬家的技巧可以让你在选择服务器时更加灵活。本文将详细介绍如何使用宝塔面板来搬迁WordPress网站。 1. 备份数据库 记住数据库用户名和密码…

Python 批量读取西门子PLC

需要安装 pip install python-snap7 import snap7 from snap7.util import * import struct # PLC的IP地址, Rack和Slot plc snap7.client.Client() plc.connect(127.0.0.1, 0, 1) # IP, Rack, Slot # 读取DB1中的10个字节&#xff0c;起始于0位置 db_number …

企业多样化需求一键满足:可道云teamOS,助力定制专属企业网盘

在这个飞速发展的数字化时代&#xff0c;企业的运营需求越来越多样化&#xff0c;如何高效地管理数据、实现安全协作&#xff0c;成为摆在我们面前的重要课题。 幸运的是&#xff0c;我遇到了可道云teamOS。 首先&#xff0c;可道云teamOS的自定义用户权限功能让我印象深刻。…

Bug定义及生命周期(七)

BUG 定义 软件的bug&#xff0c;软件程序的漏洞或缺陷 – 常见&#xff0c;首先发现 软件可改进的细节&#xff0c;或与需求文档存在差异的功能实现等 测试工程师&#xff1a;发现bug&#xff0c;定位bug&#xff0c;提交bug&#xff0c;回归bug 类型 确定bug类型&#xff…

Android-->产物收集(含apk文件重命名, aab文件重命名)

以前写过修改apk生成路径和文件名的文章, 如下: AS–›Gradle 7.0.0/4.1.0/4.0/3.3/3.0 修改APK生成路径和文件名(附AAR修改方式以及分析过程)_com.android.build.gradle.internal.api.libraryvaria-CSDN博客 这种方法入侵了gradle,破坏了原有的gradle环境, 经常会导致如下问…

2024年8月中国数据库排行榜:OceanBase攀升再夺冠,达梦跃入三甲关

在这个炽热的季节&#xff0c;随着巴黎奥运会的盛大开幕&#xff0c;全球将目光聚集在了体育的无限魅力和竞技的巅峰对决上。如同奥运赛场上的激烈角逐&#xff0c;中国数据库界也上演着一场技术与创新的较量&#xff0c;各个数据库产品正在中国乃至全球舞台上展示着它们的实力…

mitmproxy 抓包工具的使用

motmproxy 是一个支持 HTTP/HTTPS 协议的抓包程序&#xff0c; 和 Fiddler, Charles 有些类似的功能&#xff0c;只不过它以控制台的形式操作 mitmproxy 还有两个关联组件。 一个是 mitmdump &#xff0c; 这是 mitmproxy 的命令接口&#xff0c; 利用它我们可以对接 Python …

企业用的文件加密软件有哪些?2024年最好用的十款文件加密软件

随着数字化转型的深入&#xff0c;企业数据安全成为了一个日益重要的议题。文件作为企业日常运营和知识管理的核心载体&#xff0c;其安全性直接关系到企业的商业机密和知识产权保护。为了应对日益严峻的数据安全挑战&#xff0c;市场上出现了多款功能强大、操作简便的文件加密…

从0开始搭建vue + flask 旅游景点数据分析系统(十):Element-UI消息插件封装

上一期我们使用过了elementui的Message来弹出消息提示框&#xff0c;但是上期的写法每次都要在vue文件中引入Message&#xff0c;并且要写不少重复代码&#xff0c;这一期就以插件方式将message封装到Vue的实例中。 创建plugins/message.js 这边加了判断的作用是&#xff0c;…

备忘录内容可以隐藏内容吗 备忘录内容在哪隐藏

在现代忙碌的生活中&#xff0c;备忘录成为了我们不可或缺的助手。它帮助我们记录重要的事项、想法和灵感&#xff0c;确保我们不会错过任何关键信息。然而&#xff0c;随着备忘录里积累的内容越来越多&#xff0c;很多人开始担心这些私密信息的安全。毕竟&#xff0c;如果备忘…