Find the Closest Palindrome:寻找与给定目标大小最接近且尽可能小的回文
来源:互联网 发布:英文美文软件 编辑:程序博客网 时间:2024/06/05 04:08
Given an integer n, find the closest integer (not including itself), which is a palindrome.
The 'closest' is defined as absolute difference minimized between two integers.
Example 1:
Input: "123"Output: "121"
Note:
- The input n is a positive integer represented by string, whose length will not exceed 18.
- If there is a tie, return the smaller one as answer.
思路:对于123这种普通数字,从中折半取前半段,再反转过来,如12|3,取12,因为是奇数,所以翻折成121(若是偶数如1|2,就翻折成11)。
难点在于:10,100,200这种有可能向下取,也有可能向上取。
如10,答案应该是9。
100->99。
200->202。
所以考虑把前半段分别+1和-1,在翻折,结合最开始直接翻折,比较选出最合适的答案。
如10:
a.直接处理 1|0 ->11
b.前半段+1 2|0 ->22
c. 前半段-1 9| _ -> 9 (这里情况特殊。,因为-1后为0,所以直接将0替换成9)
如100:
a.直接处理 10|0 ->101
b.前半段+1 11|0 ->111
c. 前半段-1 9|0 -> 99
关于翻折,就是取前半段然后反转。如果长度是奇数,则正中间不动,将剩余前半段逆序然后连接上,如果长度为偶数,则直接将前半段逆序在连接上。
以上过程可以参见:https://leetcode.com/problems/find-the-closest-palindrome/solution/
class Solution {public String mirror(String n) {String sub = n.substring(0, n.length() / 2);return sub + (n.length() % 2 == 1 ? n.charAt(n.length() / 2) : "")+ (new StringBuilder(sub).reverse().toString());}public String nearestPalindromic(String n) {if(n.length()==1) return (Integer.parseInt(n) - 1) + "";//针对0,1,2,3..,9这几种长度为1的情况// 翻折版本long diff1 = 0;String r1 = mirror(n);diff1 = Math.abs(Long.parseLong(n) - Long.parseLong(r1));if(diff1==0) diff1 = Long.MAX_VALUE;//不能出现自身这种情况,题目中明确要求// 针对100->99这种情况,折半减去1long diff2 = 0;//注意:此处极容易错,会把10返回11,而不是9,因为当奇数时把中间位置忽略了,对于n=10,s1=11而使s2变为00,s3=22而错误!!int i = (n.length() -1)/ 2 ;//注意此处是n.length() -1/ 2,千万不是n.length() / 2 - 1!!!!!!!因为要把奇数时中间的那位也算上StringBuilder s = new StringBuilder(n);while (i >= 0 && s.charAt(i) == '0') {s.replace(i, i + 1, "9");i--;}if (i == 0 && s.charAt(i) == '1') {s.delete(i, i + 1);//针对10这种情况,如果不补充删除1后s变成0,那么最后结果s2为0s.replace(((s.length() -1)/ 2), ((s.length() -1)/ 2+1), "9");} else {s.replace(i, i + 1, (char) (s.charAt(i) - 1) + "");}String r2 = mirror(s.toString());diff2 = Math.abs(Long.parseLong(n) - Long.parseLong(r2));// 针对200->202这种情况,折半加上1long diff3 = 0;int x = (n.length() -1) / 2 ;System.out.println("x: "+x);s = new StringBuilder(n);while (x >= 0 && s.charAt(x) == '9') {s.replace(x, x + 1, "0");x--;}if (x < 0) {//注意此处是x<0,因为是要填充,与上面的diff2不同s.insert(0, '1');} else {s.replace(x, x + 1, (char) (s.charAt(x) + 1) + "");}String r3 = mirror(s.toString());diff3 = Math.abs(Long.parseLong(n) - Long.parseLong(r3));System.out.println("s1,s2,s3 "+r1+" "+r2+" "+r3);if (diff2 <= diff1 && diff2 <= diff3)return r2;if (diff1 <= diff3 && diff1 <= diff2)return r1;elsereturn r3;}}
阅读全文
0 0
- Find the Closest Palindrome:寻找与给定目标大小最接近且尽可能小的回文
- leetcode 564. Find the Closest Palindrome 距离自己最近的回文数字
- 564. Find the Closest Palindrome
- 564. Find the Closest Palindrome
- 564. Find the Closest Palindrome (Hard)
- leetcode 564. Find the Closest Palindrome
- 3Sum Closest 3个数字的和等于或者最接近与目标数
- 3Sum Closest 找出最接近目标的三元组
- LeetCode 564: Find the Closest Palindrome(python)
- leetcode 564. Find the Closest Palindrome(java)
- [Leetcode] 564. Find the Closest Palindrome 解题报告
- 9.5位操作(三)——给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数
- 程序员面试金典: 9.5位操作 5.3给定正整数,找出与其二进制表示中1的个数相同、且大小最接近的两个数
- [LeetCode]—3Sum Closest 求数组中三个数之和最接近给定target的组合
- 16. 3Sum Closest(找出和最接近给定值的三个数)
- 任意给定一个自然数N,要求M是N的倍数,且他的所有各位数字都是由0或1组成,并要求M尽可能小
- LeetCode 3Sum Closest 最接近目标数的三个数和
- 如何查与给定时间最接近的一条信息
- (转载)SSH框架的整合详解(Struts2 + Spring + Hibernate)
- PDI FOR MAYA 学习笔记
- [DP] POJ 3666
- linux安装mysql报错
- msyql系统变量max_connect_errors
- Find the Closest Palindrome:寻找与给定目标大小最接近且尽可能小的回文
- 大型Java项目架构演进(小白)
- exiv2 visual studio 2015 上使用
- 17.12.19有感
- Spring Boot集成MyBatis、druid
- python(学习)四、 centos下python与yum重装
- 50-IO流(序列流-SequenceInputStream).
- 文件处理技术
- kdevelop汉化