Leetcode 564.寻找最近的回文数
寻找最近的回文数
给定一个整数 n ,你需要找到与它最近的回文数(不包括自身)。
"最近的"定义为两个整数差的绝对值最小。
示例 1:
输入: "123"
输出: "121"
注意:
- n 是由字符串表示的正整数,其长度不超过18。
- 如果有多个结果,返回最小的那个。
1 public class Solution { 2 public String mirroring(String s) { 3 String x = s.substring(0, (s.length()) / 2); 4 return x + (s.length() % 2 == 1 ? s.charAt(s.length() / 2) : "") + new StringBuilder(x).reverse().toString(); 5 } 6 public String nearestPalindromic(String n) { 7 if (n.equals("1")) 8 return "0"; 9 10 String a = mirroring(n); 11 long diff1 = Long.MAX_VALUE; 12 diff1 = Math.abs(Long.parseLong(n) - Long.parseLong(a)); 13 if (diff1 == 0) 14 diff1 = Long.MAX_VALUE; 15 16 StringBuilder s = new StringBuilder(n); 17 int i = (s.length() - 1) / 2; 18 while (i >= 0 && s.charAt(i) == '0') { 19 s.replace(i, i + 1, "9"); 20 i--; 21 } 22 if (i == 0 && s.charAt(i) == '1') { 23 s.delete(0, 1); 24 int mid = (s.length() - 1) / 2; 25 s.replace(mid, mid + 1, "9"); 26 } else 27 s.replace(i, i + 1, "" + (char)(s.charAt(i) - 1)); 28 String b = mirroring(s.toString()); 29 long diff2 = Math.abs(Long.parseLong(n) - Long.parseLong(b)); 30 31 32 s = new StringBuilder(n); 33 i = (s.length() - 1) / 2; 34 while (i >= 0 && s.charAt(i) == '9') { 35 s.replace(i, i + 1, "0"); 36 i--; 37 } 38 if (i < 0) { 39 s.insert(0, "1"); 40 } else 41 s.replace(i, i + 1, "" + (char)(s.charAt(i) + 1)); 42 String c = mirroring(s.toString()); 43 long diff3 = Math.abs(Long.parseLong(n) - Long.parseLong(c)); 44 45 if (diff2 <= diff1 && diff2 <= diff3) 46 return b; 47 if (diff1 <= diff3 && diff1 <= diff2) 48 return a; 49 else 50 return c; 51 } 52 }