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

news/2024/11/12 6:27:15/

一、题目

        给定正整数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.ppmy.cn/news/1509086.html

相关文章

【前端】NodeJS:MongoDB

文章目录 1 简介1.1 MongoDB是什么1.2 数据库是什么1.3 数据库的作用1.4 数据库管理数据的特点1.5 为什么选择MongoDB 2 核心概念3 下载安装与启动4 命令行交互4.1 数据库命令4.2 集合命令4.3 文档命令4.4 应用场景4.4.1 新增4.4.2 删除4.4.3 更新4.4.4 查询 5 Mongoose5.1 介绍…

CentOS7.6 RabbitMQ消息队列集群部署——实施方案

1、前期环境准备&#xff08;每个主机都配置&#xff09; 1.准备三台主机 IP地址主机名内存大小192.168.200.10 rabbitmq1 2G192.168.200.11rabbitmq22G192.168.200.55rabbitmq32G 2. 设置主机名 hostnamectl set-hostname 主机名suexit Ctrlr 3. 设置IP地址然后重启网卡 …

20240810从串口查看荣品RK3588S-AHD开发板出厂预置的Android的版本

20240810从串口查看荣品RK3588S-AHD开发板出厂预置的Android的版本 2024/8/10 16:46 1、通过串口&#xff1a; console:/ # console:/ # getprop ro.build.version.release 13 console:/ # 【请严重注意&#xff0c;adb的那条USB2.0的公公线&#xff0c;一定要插到蓝色的USB3…

高等数学/概率论/数理统计/线性代数/离散数学面试-核心概念-问题理解

目录 1.特征值与特征向量 2.矩阵的秩&#xff0c;满秩代表什么&#xff1f;怎么判断满秩&#xff1f; 3.奇异值分解 4.正定矩阵 5.线性相关和线性无关 6.全概率公式与贝叶斯公式 7.极大似然估计 8.大数定律与中心极限定理 9.傅立叶变换 10.连续与可导有什么关系&#…

Open3D 计算点云的协方差矩阵(原理详细版)

目录 一、概述 1.1协方差矩阵的定义 1.2实现步骤 1.3应用 二、代码实现 1.1实现代码 2.2协方差应用案例 2.2.1主成分分析法的应用 2.2.2平面拟合 三、疑问解答 3.1为什么计算协方差矩阵要去质心&#xff1f; 3.1.1原因 3.1.2区别 Open3D点云算法汇总及实战案例汇总…

【数学分析笔记】第1章第2节:映射与函数(3)

1. 集合与映射 1.15.4 函数的参数表示 自变量 x x x和因变量 y y y不好直接表示&#xff0c;可以引入参数 t t t&#xff0c;则 { x x ( t ) y y ( t ) , t ∈ [ a , b ] \left\{\begin{array}{ll} xx(t) \\ yy(t) \end{array}\right.,t\in[a,b] {xx(t)yy(t)​,t∈[a,b]&am…

HTTP的场景实践

HTTP的场景实践&#xff1a;任选一个浏览器&#xff0c;对于其涉及的请求中的缓存策略展开具体分析 1. 强缓存&#xff1a; Cache-Control用于指定缓存的最长有效时间。 Expires用于指定资源过期的日期。 2. 协商缓存&#xff1a; ETag用于标识资源的唯一标识符&#xff0c;…

vue3 中 ref 使用 ts 中的接口定义类型

在 Vue 3 中&#xff0c;当使用 TypeScript 结合 ref 时&#xff0c;可以通过接口来定义其类型。 首先&#xff0c;定义一个接口&#xff1a; interface User {name: string;age: number;} 然后在组件中使用 ref &#xff1a; import { ref } from "vue";const u…