友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
|
|
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

公众号的微信号是: jikerizhi。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
564. 寻找最近的回文数
给定一个表示整数的字符串 n,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。
“最近的”定义为两个整数差的绝对值最小。
示例 1:
输入: n = "123" 输出: "121"
示例 2:
输入: n = "1" 输出: "0" 解释: 0 和 2是最近的回文,但我们返回最小的,也就是 0。
提示:
-
1 <= n.length <= 18 -
n只由数字组成 -
n不含前导 0 -
n代表在[1, 1018 - 1]范围内的整数
思路分析
有点脑筋急转弯的感觉。一脸懵逼,直接抄到的答案!
-
一刷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* @author D瓜哥 · https://www.diguage.com
* @since 2026-03-17 20:23:41
*/
private long min = Long.MAX_VALUE;
private long result;
public String nearestPalindromic(String n) {
long num = Long.parseLong(n);
int m = n.length(); // num 的十进制长度
update((long) Math.pow(10, m - 1) - 1, num); // 十进制长为 m-1 的最大回文数
update((long) Math.pow(10, m) + 1, num); // 十进制长为 m+1 的最小回文数
int left = Integer.parseInt(n.substring(0, (m + 1) / 2));
for (int l = left-1; l <= left + 1; l++) {
long palindromic = l;
for (int x = m % 2 > 0 ? l / 10 : l; x > 0; x /= 10) {
palindromic = palindromic * 10 + (x % 10);
}
update(palindromic, num);
}
return Long.toString(result);
}
private void update(long palindromic, long num) {
long d = Math.abs(palindromic - num);
if (d > 0 && (d < min || d == min && palindromic < result)) {
min = d;
result = palindromic;
}
}

