本文涉及知识点
枚举
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)的逆序10⋯01,其中0共有n−1位(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} {(x−1)+strMid+(x−1)的逆序9⋯9,其中9共有n−1位(x−1)和x的位数相同,且x−1不为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++**实现。