564. 寻找最近的回文数
Posted establish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了564. 寻找最近的回文数相关的知识,希望对你有一定的参考价值。
给定一个整数 n ,你需要找到与它最近的回文数(不包括自身)。 “最近的”定义为两个整数差的绝对值最小。 示例 1: 输入: "123" 输出: "121" 注意: n 是由字符串表示的正整数,其长度不超过18。 如果有多个结果,返回最小的那个。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-the-closest-palindrome 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题目我个人认为没有太多花里胡哨的东西。首先读题,我们能够获取如下信息:
1、n是正整数,因此规避了0、空这种情况。
2、若n本身就是一个回文串,则需要重新构造一个回文串。
3、最近指的是差的绝对值最小,这样就导致了存在三种构造方式:进位、退位、同位。
所谓进位指的是原本n是3位数,所构造的回文数为4位数,由于有最近约束,显然进且仅当n为9999*时才会引发此种操作,那么相应的回文数也很简单即为n+2.
所谓退位构造指的是n原本是3位数,所构造的回文数变成了2位数,这种情况没有什么必然的,当同位构造无法满足时将会引起退位构造,而所构造的也必然是999*。
所谓同位构造指的是n原本是3位数,所构造的回文数也是3位数。这种情况最常见。
依据所获取的信息实际上就可以进行编码了。但是需要注意的是,在同位构造的时候需要考虑集中情况,例如数字12189构造时可以是12121也可以是12221甚至可以是12021。对于一个数字n,到底是哪一种,需要依据距离判断。
public String nearestPalindromic(String n) { if(n == null || n.length() == 0) return null;
long ori = Long.parseLong(n); if(n.length()==1) {return String.valueOf(ori -1); } StringBuilder ans = new StringBuilder(); char[] ch = n.toCharArray(); /*实际上构造回文分为三种情况, 分别是 退位,同位,进位,分别比较*/ long back = 9; for(int i =2;i<ch.length;i++){ back *= 10; back += 9; } long backLength = Long.parseLong(n) - back; /*此时解决9999这类的*/ boolean flag = true; for(int i=0;i<ch.length;i++){ if(ch[i] !=‘9‘){ /*说明不需要进位构造*/ flag = false; break; } } if(flag) { return String.valueOf(ori +2); } /*同位构造。需要排除自己本身就是回文串的情况*/ char[] same = new char[ch.length]; same = Arrays.copyOfRange(ch, 0, ch.length); int left = 0; int right = ch.length -1; while(left<right){ same[right] = same[left]; right--; left++; } long sameNum = Long.parseLong(new String(same)); long sameLength = Math.abs(Long.parseLong(n) - sameNum); sameLength = sameLength==0?Long.MAX_VALUE:sameLength; /*此处检测所构造的是否为最近的回文串*/ int div = 0; long line = 0; if((same.length & 0x01) == 1){ div = ch.length/2; line = (long) Math.pow(10,div); }else { div = ch.length/2; line = (long) (11*Math.pow(10, div-1)); } if(same[div] >=‘1‘){ long temp = Long.parseLong(new String(same)) - line; long tempLength = ori - temp; if(tempLength<=sameLength){ sameLength = tempLength; sameNum = temp; } } if(same[div] < ‘9‘){ long temp = Long.parseLong(new String(same)) + line; long tempLength = temp - ori; if(tempLength < sameLength){ sameLength = tempLength; sameNum = temp; } } return (backLength<=sameLength?String.valueOf(back):String.valueOf(sameNum)); }
以上是关于564. 寻找最近的回文数的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 6. Z 字形变换 / 564. 寻找最近的回文数 / 258. 各位相加
2022-02-17:寻找最近的回文数。 给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。 “最近的”定义为两个整数差的绝对值最小。 示例 1: 输