leetcode 564. Find the Closest Palindrome(java)

本文介绍了一种寻找与给定正整数最接近的回文数的方法,通过构造可能的回文数并比较距离实现算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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:

Input: "123"
Output: "121"

分析:

题目大意:给定一个由正整数n组成的字符串,长度不超过18,找到与n最接近的回文数字(不包括本身)。
思路:
1.定义标准的回文数字:取n的前一半,对折得到target。例如:n=1234;target=1221;
2.因为要与n最接近,所以将(n.length-1)/2的位置上的数字+1,0(target),-1,然后将左半边的赋值给右半边,分为三种情况,并考虑特殊情况;
3.中间数字为9,+1时,比如12922---->13031,比n大一位;中间数字为0,-1时,比如10003---->9999,比n小一位。

注意:

1.正整数n长度不超过18,用long型表示;
2.如果big-target=target-small,返回small;

代码:

public class nearestPalindromic564 {
public static void main(String[] args) {
/*Random random = new Random();
Long num = random.nextLong();
System.out.println(num);
num =Math.abs(num);
System.out.println(num);
System.out.println(nearestPalindromic(String.valueOf(num)));*/
System.out.println(nearestPalindromic(String.valueOf(11)));
}


public static String nearestPalindromic(String n) {
        Long num = Long.parseLong(n);
        Long big = findBigPalindrome(num+1);
        Long small = findSmallPalindrome(num-1);
        return (big-num)<(num-small) ? String.valueOf(big) : String.valueOf(small);
        
    }
public static Long findBigPalindrome(Long num) {
String nStr = String.valueOf(num);
char[] c = nStr.toCharArray();
int len = c.length;
//char[] target = c;
char[] target = Arrays.copyOf(c, len);
for(int i=0; i<len/2; i++) {
target[len-1-i] = c[i];
}
for(int i=0; i<len; i++) {
if(c[i]<target[i]) {
return Long.parseLong(String.valueOf(target));
}else if(c[i]>target[i]) {
for(int j=(len-1)/2; j>=0; j--) {
if(++target[j]>'9')
target[j]='0';
else
break;
}


for(int k=0; k<len/2; k++) {
target[len-1-k] = target[k];
}
return Long.parseLong(String.valueOf(target));
}
}
return Long.parseLong(String.valueOf(target));
}
public static Long findSmallPalindrome(Long num) {
String nStr = String.valueOf(num);
char[] c = nStr.toCharArray();
int len = c.length;
//char[] target = c;
char[] target = Arrays.copyOf(c, len);
for(int i=0; i<len/2; i++) {
target[len-1-i] = c[i];
}

for(int i=0; i<len; i++) {
if(c[i]>target[i]) {
return Long.parseLong(String.valueOf(target));
}else if(c[i]<target[i]) {
for(int j=(len-1)/2; j>=0; j--){
if(--target[j]<'0')
target[j]='9';
else 
break;
}
if(target[0]=='0') {
char[] tar2 = new char[len-1];
Arrays.fill(tar2, '9');
return Long.parseLong(String.valueOf(tar2));
}
for(int k=0; k<len/2; k++) {
target[len-1-k] = target[k];
}
return Long.parseLong(String.valueOf(target));
}

}
return Long.parseLong(String.valueOf(target));
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值