友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: 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;
  }
}