【枚举】564. 寻找最近的回文数

本文涉及知识点

枚举

LeetCode564. 寻找最近的回文数

给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。
“最近的”定义为两个整数差的绝对值最小。
示例 1:
输入: n = “123”
输出: “121”
示例 2:
输入: n = “1”
输出: “0”
解释: 0 和 2是最近的回文,但我们返回最小的,也就是 0。
提示:
1 <= n.length <= 18
n 只由数字组成
n 不含前导 0
n 代表在 [1, 1018 - 1] 范围内的整数

枚举

令 nl = n.length。
如果1 == nl ,返回strig(1,n[0]-1);
half =nl/2
string strMid = (1&ml) ? n[half] : “”;
令 x = atoi(n.sub(0,half));
否则比较如下三个数:
第一个数:x+strMid + x的逆序
第二个数:
{ ( x + 1 ) + s t r M i d + ( x + 1 ) 的逆序 ( x + 1 ) 和 x 的位数相同 10 ⋯ 01 , 其中 0 共有 n − 1 位 o h e r \begin{cases} (x+1)+strMid + (x+1)的逆序 && (x+1)和x的位数相同 \\ 10\cdots 01 ,其中0共有n-1位 &&oher \end{cases} {(x+1)+strMid+(x+1)的逆序1001,其中0共有n1(x+1)x的位数相同oher

第三个数:(x-1) + strMid + (x-1)的逆向
{ ( x − 1 ) + s t r M i d + ( x − 1 ) 的逆序 ( x − 1 ) 和 x 的位数相同,且 x − 1 不为 0 9 ⋯ 9 , 其中 9 共有 n − 1 位 o h e r \begin{cases} (x-1)+strMid + (x-1)的逆序 && (x-1)和x的位数相同,且x-1不为0 \\ 9\cdots 9 ,其中9共有n-1位 &&oher \end{cases} {(x1)+strMid+(x1)的逆序99,其中9共有n1(x1)x的位数相同,且x1不为0oher

当strMid不为空时,枚举0到9,因为本题运算量比较小,可以全部枚举。

代码

核心代码

class Solution {
public:string nearestPalindromic(string n) {const int nl = n.length();const long long llN = atoll(n.c_str());if (1 == nl) { return string(1, n[0] - 1); }const int half = nl / 2;const string strMid = (nl & 1) ? string(1,n[half]) : "";string sx = n.substr(0, half);long long x = atoll(sx.c_str());vector<string> res;auto Add1 = [&](long long x,string sMid) {string tmp = std::to_string(x);string s1 = tmp + sMid + string(tmp.rbegin(), tmp.rend());	res.emplace_back(s1);};if ("" == strMid) {Add1(x, "");}else {for (char ch = '0'; ch <= '9'; ch++) {Add1(x, string(1, ch));}}		auto Add = [&](int y) {string sxa = std::to_string(y);if ((0 == y)||(sx.length() > sxa.length())) {res.emplace_back(nl - 1, '9');}else if (sx.length() == sxa.length()) {if ("" == strMid) {res.emplace_back(sxa  + string(sxa.rbegin(), sxa.rend()));return;}for (char ch = '0'; ch <= '9'; ch++) {res.emplace_back(sxa + string(1, ch) + string(sxa.rbegin(), sxa.rend()));}}else {res.emplace_back('1' + string(nl - 1, '0') + '1');}};Add(x + 1);Add(x - 1);vector<long long> vRes;for (const auto& s : res) {if (s == n) { continue; }long long cur = atoll(s.c_str());vRes.emplace_back(cur);}sort(vRes.begin(), vRes.end());long long llSub = LLONG_MAX;long long llRes = 0;for (const auto& cur : vRes) {	if (abs(cur - llN) < llSub) {llSub = abs(cur - llN);llRes = cur;}}return std::to_string(llRes);}
};

单元测试

template<class T1,class T2>
void AssertEx(const T1& t1, const T2& t2)
{Assert::AreEqual(t1 , t2);
}template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{Assert::AreEqual(v1.size(), v2.size());	for (int i = 0; i < v1.size(); i++){Assert::AreEqual(v1[i], v2[i]);}
}template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{sort(vv1.begin(), vv1.end());sort(vv2.begin(), vv2.end());Assert::AreEqual(vv1.size(), vv2.size());for (int i = 0; i < vv1.size(); i++){AssertEx(vv1[i], vv2[i]);}
}namespace UnitTest
{string n;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod0){n = "123";auto res = Solution().nearestPalindromic(n);AssertEx(string("121"), res);}TEST_METHOD(TestMethod1){n = "1";auto res = Solution().nearestPalindromic(n);AssertEx(string("0"), res);}TEST_METHOD(TestMethod2){n = "332";auto res = Solution().nearestPalindromic(n);AssertEx(string("333"), res);}TEST_METHOD(TestMethod3){n = "100";auto res = Solution().nearestPalindromic(n);AssertEx(string("99"), res);}TEST_METHOD(TestMethod4){n = "1000";auto res = Solution().nearestPalindromic(n);AssertEx(string("999"), res);}TEST_METHOD(TestMethod5){n = "99";auto res = Solution().nearestPalindromic(n);AssertEx(string("101"), res);}TEST_METHOD(TestMethod6){n = "999";auto res = Solution().nearestPalindromic(n);AssertEx(string("1001"), res);}TEST_METHOD(TestMethod7){n = "11911";auto res = Solution().nearestPalindromic(n);AssertEx(string("11811"), res);}TEST_METHOD(TestMethod8){n = "11011";auto res = Solution().nearestPalindromic(n);AssertEx(string("11111"), res);}TEST_METHOD(TestMethod9){n = "88";auto res = Solution().nearestPalindromic(n);AssertEx(string("77"), res);}};
}

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

【日记】常去的那家饭馆转让了……(399 字)

正文 晚上吃饭&#xff0c;常去的那家饭馆门市转让了&#xff0c;不做了。sad。 不久之前&#xff0c;临近下班了&#xff0c;我忘了报一个表给副行长&#xff0c;那时候系统已经进不去了&#xff0c;查不了数据。于是我随便转发了一张以前的日报表给他&#xff0c;日期都没改。…

长亭雷池部署

安雷池推荐环境 我这个网站的1804也就是18.04 Index of /ubuntu-releases/ (163.com) 然后照着ppt做就行自带ubunutu 我是默认安装不是简易安装 之前在自己的虚拟机docker上试过安装github上的雷池 现在重新安装了ubuntu 在我的ubuntu上安装一个雷池 这是长亭的学习计划 …

Elasticsearch 认证模拟题 - 19

一、题目 使用异步查询 task1 索引&#xff0c;并且 找到 miantable_name 字段值为 name8 的文档 1.1 考点 异步搜索 1.2 答案 POST task1/_async_search {"query": {"term": {"miantable_name": {"value": "name8"}}}…

excel中按多列进行匹配并对数量进行累加

公司的生产计划是按订单下发&#xff0c;但不同订单的不同产品中可能有用到相同的配件&#xff0c;按单1对1时&#xff0c;对计算机十分友好&#xff0c;但对于在配件库检料的工人来说就比较麻烦&#xff0c;上百条产品里可能会有多条都是相同的产品&#xff0c;首先考虑的办法…

Tuple 元组

文章目录 一、什么是元组 &#xff1f;二、元组的具体操作2.1 创建元组2.1.1 tuple() 创建元组函数和 list() 创建列表函数总结 2.2 元组的元素访问操作2.3 元组的元素计数操作2.4 zip 对象 一、什么是元组 &#xff1f; 列表属于可变序列,可以任意修改列表中的元素。 元组的…

前端菜鸡流水账日记 -- pnpm的学习

哈咯哇大家&#xff0c;我又来了&#xff0c;最近稍微悠闲一些&#xff0c;所以就趁着这个机会学习一些新的知识&#xff0c;今天就是碰巧遇到了pnm&#xff0c;这个可以看作是npm的升级版本&#xff0c;比npm要快&#xff0c;用起来也更得劲更迅速 官网地址&#xff1a;https…

易灸灸的微商模式,新零售全案运营,裂变营销与代理模式

易灸灸的独特之处在于其受众面广&#xff0c;男女老少均可使用&#xff0c;且作为短时间消耗品&#xff0c;具有高复购率的特点。这使得裂变营销模式成为易灸灸的最佳选择。裂变营销通过用户的分享和推荐&#xff0c;快速提高品牌的知名度&#xff0c;降低营销成本&#xff0c;…

SJ704安全帽电绝缘性能测试仪

一、仪器用途 用于测试安全帽对电的绝缘性能。 二、主要技术指标 1、电流表示值误差1% 2、电压表示值误差1% 3、计时器示值误差1% 4、探头直径4mm&#xff0c;顶端为半球形 5、能在1min内电压增加至1200V25V&#xff0c;保持15s。最大测试电压5KV。 三、仪器特征 1、配…

Linux系统学习——指令二

Linux系统学习——指令二 sed 指令perl 指令rpm 指令rz 和 sz 指令查看文件大小及压缩文件指令使用tar命令&#xff1a;使用zip命令&#xff1a;注意事项&#xff1a; 解压文件指令 sed 指令 使用sed命令&#xff1a;sed -i s/旧内容/新内容/g 文件名&#xff0c;这将会在文件…

2024.06.02 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 特斯拉计划在中国推出FSD&#xff1b;续航2100km 比亚迪发布第五代DM技术&#xff1b;佑驾创新向港交所提交上市申请 自动驾驶一周资讯 - 特斯拉计划在中国推出FS…

FuTalk设计周刊-Vol.036

&#x1f525;AI漫谈 热点捕手 1、Stable Zero123:从单张图像生成高质量 3D 对象 Stable Zero123 可以生成物体的新颖视图&#xff0c;展示从各个角度对物体外观的 3D 理解&#xff0c;由于训练数据集和高程条件的改进&#xff0c;其质量比 Zero1-to-3 或 Zero123-XL 显著提高…

课时156:脚本发布_简单脚本_变量转化

2.1.2 变量转化 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 问题&#xff1a;脚本里面的手写的固定的内容太多了&#xff0c;更改时候费劲所以通过变量的方式实现信息的固化简单实践 实践 查看脚本内容 #!/bin/bash # 功…

南通国际高中有哪些?南通惠立学校高中部校长见面日重磅来袭

惠灵顿&#xff08;中国&#xff09;自2011年成立以来&#xff0c;一直坚持深耕国际与双语教育&#xff0c;拥有丰厚的办学经验。依托于集团化的深厚经验南通惠立学校于2024-2025学年开设9-11年级&#xff0c;这所南通国际高中为高中学生搭建一个集卓越升学成果、强大师资、纯正…

Elasticsearch 认证模拟题 - 18

一、题目 为一个索引&#xff0c;按要求设置以下 dynamic Mapping 一切 text 类型的字段&#xff0c;类型全部映射成 keyword一切以 int_ 开头命名的字段&#xff0c;类型都设置成 integer 1.1 考点 字段的动态映射 1.2 答案 # 创建索引和索引模板 PUT my_index {"m…

Java课程设计:基于swing的学生信息管理系统

文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 这款Java swing实现的学生信息管理系统和jsp版本的功能很相似&#xff0c;简单的实现了班级信息的增删改查&#xff0c;学生信息的增删改查&#xff0c;数据库采用的是mysql&#xff0c;jdk版本不限&…

BSP驱动教程-CAN/CANFD/CANopen知识点总结分享

学习知识点整理&#xff1a; CAN 总线的前世今生&#xff1a; https://www.armbbs.cn/forum.php?modviewthread&tid104480 wikibai百科CAN总线&#xff1a; https://en.wikipedia.org/wiki/CAN_bus 瑞萨CAN入门教程&#xff1a; https://www.armbbs.cn/forum.php?m…

5.Sentinel入门与使用

5.Sentinel入门与使用 1.什么是 Sentinel?Sentinel 主要有以下几个功能: 2.为什么需要 Sentinel?3.Sentinel 基本概念3.1 什么是流量控制?3.1.1 常见流量控制算法3.1.2 Sentinel 流量控制流控效果介绍如下: 3.2 什么是熔断?熔断策略 3.3 Sentinel 组成&#xff08;资源和规…

Kafka基础架构与核心概念?有哪些应用场景?

Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。架构特点是分区、多副本、多生产者、多订阅者,性能特点主要是高吞吐,低时延。 Kafka主要设计…

永远不要做房间里“最聪明的人”(早懂早受益)

听好了&#xff0c;茶客&#xff0c;我要向你解释一些事情。 你的工作和职责是让客户认为他是房间里最聪明的人。 如果你完成了这项任务之后&#xff0c;还有多余的精力&#xff0c;应该用它来让你的高级合伙人显得像是房间里第二聪明的人。 只有履行了这两项义务之后&#xff…

JVM 垃圾回收器

一、垃圾回收器类型 如果说垃圾收集算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体 实现。下图展示了7种作用于不同分代的收集器&#xff0c;其中用于回收新生代的收集器 包括Serial、PraNew、Parallel Scavenge&#xff0c;回收老年代的收集器包括Seri…