You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.8 KiB
73 lines
1.8 KiB
package class49;
|
|
|
|
public class Problem_0564_FindTheClosestPalindrome {
|
|
|
|
public static String nearestPalindromic(String n) {
|
|
Long num = Long.valueOf(n);
|
|
Long raw = getRawPalindrome(n);
|
|
Long big = raw > num ? raw : getBigPalindrome(raw);
|
|
Long small = raw < num ? raw : getSmallPalindrome(raw);
|
|
return String.valueOf(big - num >= num - small ? small : big);
|
|
}
|
|
|
|
public static Long getRawPalindrome(String n) {
|
|
char[] chs = n.toCharArray();
|
|
int len = chs.length;
|
|
for (int i = 0; i < len / 2; i++) {
|
|
chs[len - 1 - i] = chs[i];
|
|
}
|
|
return Long.valueOf(String.valueOf(chs));
|
|
}
|
|
|
|
public static Long getBigPalindrome(Long raw) {
|
|
char[] chs = String.valueOf(raw).toCharArray();
|
|
char[] res = new char[chs.length + 1];
|
|
res[0] = '0';
|
|
for (int i = 0; i < chs.length; i++) {
|
|
res[i + 1] = chs[i];
|
|
}
|
|
int size = chs.length;
|
|
for (int j = (size - 1) / 2 + 1; j >= 0; j--) {
|
|
if (++res[j] > '9') {
|
|
res[j] = '0';
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
int offset = res[0] == '1' ? 1 : 0;
|
|
size = res.length;
|
|
for (int i = size - 1; i >= (size + offset) / 2; i--) {
|
|
res[i] = res[size - i - offset];
|
|
}
|
|
return Long.valueOf(String.valueOf(res));
|
|
}
|
|
|
|
public static Long getSmallPalindrome(Long raw) {
|
|
char[] chs = String.valueOf(raw).toCharArray();
|
|
char[] res = new char[chs.length];
|
|
int size = res.length;
|
|
for (int i = 0; i < size; i++) {
|
|
res[i] = chs[i];
|
|
}
|
|
for (int j = (size - 1) / 2; j >= 0; j--) {
|
|
if (--res[j] < '0') {
|
|
res[j] = '9';
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
if (res[0] == '0') {
|
|
res = new char[size - 1];
|
|
for (int i = 0; i < res.length; i++) {
|
|
res[i] = '9';
|
|
}
|
|
return size == 1 ? 0 : Long.parseLong(String.valueOf(res));
|
|
}
|
|
for (int k = 0; k < size / 2; k++) {
|
|
res[size - 1 - k] = res[k];
|
|
}
|
|
return Long.valueOf(String.valueOf(res));
|
|
}
|
|
|
|
}
|