找数组中与其他数绝对值差和最小的数_经典算法题:寻找最近的回文数

一、题目

给定一个整数 n ,你需要找到与它最近的回文数(不包括自身)。

“最近的”定义为两个整数差的绝对值最小。

示例 1:

输入: "123"输出: "121"

二、思路

如果数组的字符串长度 == 1,数字n - 1开头为1,9**9为一个候选答案 例:100000,答案为99999开头为9, 10**01为一个候选答案 例:99999,答案为100001如果本身对称,则把最中间的一个(或两个)位数减(如果0则加例:123321,答案为122221例:120021,答案为121121如果不对称:把前半部分逆序替换掉后半部分 例:1223,答案为1221把最中间的一个(或两个)位数加一 例:1283,答案为1331,而非1221把最中间的一个(或两个)位数减一 例:1800,答案为1771,而非1881

三、实现

public String nearestPalindromic(String n) {    // 处理特殊值 1位数    if (n.length() == 1) {        return String.valueOf(Math.abs(Long.parseLong(n) - 1));    }    // 原始数据    Long num = Long.parseLong(n);    // 原始数据直接 转回文    Long huiwen = Long.parseLong(huiwen(n));    // 从中间点数字 +1 再转回文 比如 9999 -> 10099 -> 10001    Long huiwenAdd1 = Long.parseLong(midAdd1(n));    // 从中间点数字 -1 再转回文 比如 10001 -> 9901 -> 9999    Long huiwenMin1 = Long.parseLong(midMin1(n));    // 找寻差值最小的数字    Long res = 0L;    Long abs = Long.MAX_VALUE;    if (!huiwen.equals(num)) {        res = huiwen;        abs = Math.abs(huiwen - num);    }    long add1Abs = huiwenAdd1 - num;    if (add1Abs < abs) {        abs = add1Abs;        res = huiwenAdd1;    }    long min1Abs = num - huiwenMin1;    if (min1Abs <= abs) {        abs = min1Abs;        res = huiwenMin1;    }    return res.toString();}public String midAdd1(String n) {    char[] chars = n.toCharArray();    int mid = chars.length % 2 == 0 ? chars.length / 2 - 1 : chars.length / 2;    for (int i = mid; i > -1; i--) {        if (chars[i] == '9') {            chars[i] = '0';        } else {            chars[i] += 1;            break;        }    }    if (chars[0] == '0') {        char[] newChars = new char[chars.length + 1];        newChars[0] = '1';        System.arraycopy(chars, 0, newChars, 1, chars.length);        return huiwen(new String(newChars));    } else {        return huiwen(new String(chars));    }}public String midMin1(String n) {    char[] chars = n.toCharArray();    int mid = chars.length % 2 == 0 ? chars.length / 2 - 1 : chars.length / 2;    for (int i = mid; i > -1; i--) {        if (chars[i] == '0') {            chars[i] = '9';        } else {            chars[i] -= 1;            break;        }    }    if (chars[0] == '0') {        char[] newChars = new char[chars.length - 1];        newChars[0] = '9';        System.arraycopy(chars, 1, newChars, 1, chars.length - 2);        return huiwen(new String(newChars));    } else {        return huiwen(new String(chars));    }}public String huiwen(String n) {    char[] chars = n.toCharArray();    int mid = chars.length / 2;    for (int i = 0; i < mid; i++) {        chars[chars.length - 1 - i] = chars[i];    }    return new String(chars);}
854b75aa27217003eb3f87bfaa82c969.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值