https://leetcode-cn.com/problems/find-the-closest-palindrome/comments/
重点几个,最近的回文数(不包括自己);分单双两种;重点考虑99…999和100…001和10000…0。
不是很喜欢这道题,纯粹就是因为通过率低才写的
代码:
public String nearestPalindromic(String n) {
if (n.length() == 1) {
return (char) (n.charAt(0) - 1) + "";
}
if (n.charAt(0) == '1') {
boolean allZ = true;
for (int i = 1; i < n.length(); i++) {
if (n.charAt(i) != '0') {
allZ = false;
break;
}
}
if (allZ) {
String ans = "";
for (int i = 1; i < n.length(); i++) {
ans += "9";
}
return ans;
}
}
if (n.length() % 2 == 0) {
String s1 = n.substring(0, n.length() / 2);
String s2 = n.substring(n.length() / 2);
String s3 = new StringBuilder(s1).reverse().toString();
if (s2.equals(s3)) {
long ll = Long.parseLong(s1);
if (ten(ll)) {
if (ll == 1) {
return ""+9;
}
return "" + (ll - 1) + 9 + (ll - 1);
} else if (nine(ll)) {
ll++;
String s = new StringBuilder(ll / 10 + "").reverse()
.toString();
return ll + s;
} else {
ll--;
String s = new StringBuilder(ll + "").reverse().toString();
return ll + s;
}
}
Long l1 = Long.parseLong(s2);
Long l2 = Long.parseLong(s3);
if (l1 > l2) {
long c = l1 - l2;
long c2 = l2 - l1 + g(11, s2.length());
if (c <= c2) {
return s1 + s3;
} else {
Long l = Long.parseLong(s1);
l++;
String s = new StringBuilder(l + "").reverse().toString();
return l + s;
}
} else {
long c = l2 - l1;
long c2 = l1 - l2 + g(11, s2.length());
if (c < c2) {
return s1 + s3;
} else {
Long l = Long.parseLong(s1);
l--;
String s = new StringBuilder(l + "").reverse().toString();
return l + s;
}
}
} else {
String s1 = n.substring(0, n.length() / 2);
String s2 = n.substring(n.length() / 2 + 1);
String s3 = new StringBuilder(s1).reverse().toString();
int k = n.charAt(n.length() / 2) - '0';
Long ll = Long.parseLong(s1);
if (s2.equals(s3)) {
if (k > 0) {
if (nine(ll) && k == 9) {
return (ll + 1)
+ new StringBuilder(ll + 1 + "").reverse()
.toString();
}
return s1 + (k - 1) + s2;
} else {
if (ten(ll)) {
ll = ll * 10 - 1;
return ll
+ new StringBuilder(ll + "").reverse()
.toString();
} else {
return s1 + (k + 1) + s2;
}
}
}
Long l1 = Long.parseLong(s2);
Long l2 = Long.parseLong(s3);
if (l1 > l2) {
long c = l1 - l2;
if (k == 9) {
long c2 = l2 - l1 + g(11, s2.length());
if (c <= c2) {
return s1 + k + s3;
} else {
Long l = Long.parseLong(s1);
l++;
String s = new StringBuilder(l + "").reverse()
.toString();
return l + 0 + s;
}
} else {
long c2 = l2 - l1 + g(10, s2.length());
if (c <= c2) {
return s1 + k + s3;
} else {
return s1 + (k + 1) + s3;
}
}
} else {
long c = l2 - l1;
if (k == 0) {
long c2 = l1 - l2 + g(11, s2.length());
if (c < c2) {
return s1 + k + s3;
} else {
Long l = Long.parseLong(s1);
l--;
String s = new StringBuilder(l + "").reverse()
.toString();
return l + 0 + s;
}
} else {
long c2 = l1 - l2 + g(10, s2.length());
if (c < c2) {
return s1 + k + s3;
} else {
return s1 + (k - 1) + s3;
}
}
}
}
}
private boolean nine(long ll) {
return ten(ll + 1);
}
private boolean ten(long ll) {
while (ll > 1) {
if (ll % 10 != 0) {
return false;
}
ll /= 10;
}
return true;
}
private long g(int k, int length) {
for (int i = 1; i < length; i++) {
k *= 10;
}
return k;
}
leetcode的一些已经写的觉得有意思的其他题目
https://blog.csdn.net/qq_33321609/article/category/9012437
如果有我没有写博客的其他题目需要讨论,欢迎评论,一起探讨