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

2024-06-15 18:36
文章标签 回文 枚举 最近 寻找 564

本文主要是介绍【枚举】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++**实现。

这篇关于【枚举】564. 寻找最近的回文数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064245

相关文章

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

csu1328(近似回文串)

题意:求近似回文串的最大长度,串长度为1000。 解题思路:以某点为中心,向左右两边扩展,注意奇偶分开讨论,暴力解即可。时间复杂度O(n^2); 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>#include<string>#inclu

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

寻找身高相近的小朋友

题目描述: 小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,然后就想基于各小朋友和自己的身高差对他们进行排序,请帮他实现排序。 输入描述: 第一行为正整数H和N,0<H<200,为小明的身高,0<N<50,为新班级其他小朋友个数。第二行为N个正整数H1-HN,分别是其他小朋友的身高,取值范围0<Hi<200(1<=i<=N),且N个正整数各不相同。 输出描述: 输出

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m