题目:

给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。

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

示例 1:

输入: n = "123"
输出: "121"
示例 2:

输入: n = "1"
输出: "0"
解释: 0 和 2是最近的回文,但我们返回最小的,也就是 0。

提示:

  • 1 <= n.length <= 18
  • n 只由数字组成
  • n 不含前导 0
  • n 代表在 [1, 1018 - 1] 范围内的整数

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-the-closest-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

参考官网评论区各位大佬的题解,得出对于给定的数存在最近的回文数的五种情况:

1.直接将前一半的数对称到后一半,例如123 123  --> 123 321;

2.将前一半加1对称到后一半,例如 123 45 --> 124 21;

3.将前一半减1对称到后一半,例如 123 456--> 122 221;

4.特殊情况,边界值,类似于 9999  或 999,最近的是10001  或 1001;

5.特殊情况,边界值,类似于 10001  或 100,最近的是 9999  或 99;

这五种情况得到的数,与给定的整数之差得到的绝对值最小的数即为结果。

注释:

1.当给的整数长度为奇数时,只需要从一半的前一位开始构造回文。

判断是奇数还是偶数还可以这样写:

 & 是按位与运算符
n&1: 先把n 和 1分别转换为二进制 然后对比他们二进制每个位上的数 具体规则:当双方位置上的数都为1时 结果为1,其它情况都为0,得到n与1按位与计算的二进制结果后再转为十进制与1做是否相等比较。 0&0 0
0&1 0
1&0 0
1&1 1 3 : 0011
1 : 0001
3&1 : 0001 1的二进制只有最有一位数为1(0001),那么 n&1 只有两个结果 当n的最后一位数为1时(n为奇数) n&1=1,其它情况 n&1=0;

2.  n.substring(0, (n1 + 1) / 2)

奇数个:12345, (n1 + 1) / 2 = 3,取到的一半范围[0,2] --> 123

偶数个:1234,(n1 + 1) / 2 = 2,取到的一半范围[0,1] --> 12

代码:

 1 class Solution {
2 public String nearestPalindromic(String n) {
3 long nums = Long.parseLong(n);
4 int n1 = n.length();
5 long half = Long.parseLong(n.substring(0, (n1 + 1) / 2));
6 Set<Long> set = new HashSet<>();
7 //五种情况
8 set.add(generalnum(half, n1));
9 set.add(generalnum(half + 1, n1));
10 set.add(generalnum(half - 1, n1));
11 set.add(upper(n1));
12 set.add(lower(n1));
13 long res = 0;
14 //给最小值设置初始值
15 long min = Long.MAX_VALUE;
16
17 for(Long cur : set){
18 //取当前值与给定值的差值的绝对值
19 long abs = Math.abs(cur - nums);
20 //排除相等的情况,|差值|小于最小值或者等于最小值时,当前值小于结果就更新最小值和结果值
21 if(cur != nums && (abs < min || (abs == min && cur < res))){
22 min = abs;
23 res = cur;
24 }
25 }
26 return String.valueOf(res);
27 }
28 public long generalnum(long half, int n1){
29 //奇数:12345 --> 12321
30 //偶数:1234 --> 1221
31 long cur = half;
32 long res = half;
33 //如果是奇数从倒数第二位开始
34 if((n1 % 2) != 0){
35 cur /= 10;
36 }
37 //补齐回文数的后半部分
38 while(cur != 0){
39 res = res * 10 + cur % 10;
40 cur /= 10;
41 }
42 return res;
43 }
44 public long upper(int n1){
45 // 999 --> 10001
46 long res = 1;
47 while(n1-- > 0){
48 res *= 10;
49 }
50 return res + 1;
51 }
52 public long lower(int n1){
53 //10001 -> 999
54 long res = 0;
55 while(--n1 > 0){
56 res = res * 10 + 9;
57 }
58 return res;
59 }
60 }

 小知识:

1.Long.parseLong(string):将 string 类型的参数解析为有符号十进制 ,返回一个long类型的基本类型值。

2.Long.valueOf(参数),是将参数转换成long的包装类——Long。

3.String.valueOf(long res) : 将 long 变量 res 转换成字符串。

力扣564(java)-寻找最近的回文数(困难)的更多相关文章

  1. Java实现 LeetCode 564 寻找最近的回文数(今天要GG在这道题了 头晕+题难(((φ(◎ロ◎;)φ))))

    564. 寻找最近的回文数 给定一个整数 n ,你需要找到与它最近的回文数(不包括自身). "最近的"定义为两个整数差的绝对值最小. 示例 1: 输入: "123&quo ...

  2. Leetcode 564.寻找最近的回文数

    寻找最近的回文数 给定一个整数 n ,你需要找到与它最近的回文数(不包括自身). "最近的"定义为两个整数差的绝对值最小. 示例 1: 输入: "123" 输出 ...

  3. Java实现 LeetCode 9 回文数

    9. 回文数 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false ...

  4. [Swift]LeetCode564. 寻找最近的回文数 | Find the Closest Palindrome

    Given an integer n, find the closest integer (not including itself), which is a palindrome. The 'clo ...

  5. java 蓝桥杯基础训练 回文数

    public class _8回文数 { //两种方法都可以 // public static void main(String[] args) { // String zheng ="&q ...

  6. 力扣(LeetCode)125. 验证回文串

    给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a c ...

  7. 蓝桥网试题 java 基础练习 特殊回文数

    ------------------------------------------------------------------------------------- 简单点,对话的方式简单点 有 ...

  8. 力扣(LeetCode) 9.回文数

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  9. Java 9.回文数

    给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false .回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数.    例如,121 是回文,而 123 不是. ...

  10. Java判断回文数算法简单实现

    好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...

随机推荐

  1. windows下删除文件时提示“操作无法完成 因为文件已在。。。”解决方案

    解决方案:利用"资源监视器",如上图: 具体步骤: win+r,输入perfmon打开资源监视器 或者 右键--Windows 7任务栏--启动任务管理器--性能--资源监视器-- ...

  2. 视野修炼第71期 | Rspack 家族新成员 Rsdoctor

    欢迎来到第 71 期的[视野修炼 - 技术周刊],下面是本期的精选内容简 强烈推荐 Rspack 新成员:Rsdoctor Bun Shell DCloud:App跨平台框架对比2023版 开源工具& ...

  3. 阿里云服务器安装mysql后本地连接失败

    阿里云服务器安装mysql后本地连接失败 一.问题描述 在阿里云安装mysql后,想在本地电脑用可视化工具连接mysql,但是提示连接失败 错误如图所示: 二.问题分析 1.检查3306端口 首先,检 ...

  4. 使用docker运行nginx服务,挂载自定义配置文件

    错误命令: 下面的方式,启动容器时,-d 后面跟一个指定容器ID的参数写在前面,导致容器不能正常启动,出现异常 docker run --name testnginx -d 7f0fd59e0094  ...

  5. KingbaseES V8R6 集群运维案例--麒麟系统bug导致sys_monitor.sh无法启动集群

    案例说明: 麒麟信安操作系统,在部署了KingbaseES V8R6集群后,sys_monitor.sh在启动集群时,启动数据库服务失败,导致集群无法正常启动.后连接现场分析发现,此环境只要通过ssh ...

  6. 初学STM32 CAN通信(二)

    初学STM32 CAN通信(二) 1. STM32的CAN外设 ​ STM32的芯片中具有bxCAN控制器 (Basic Extended CAN),它支持CAN协议2.0A和2.0B标准. ​ 该C ...

  7. Linux服务器程序规范化

    Linux日志体系 rsyslogd守护进程既能接收用户进程输出的日志,又能接收内核日志.用户进程是通过调用syslog函数生成系统日志的.该函数将日志输出到一个UNIX本地域socket类型(AF_ ...

  8. 5W1H聊开源之Who和How——谁、如何参与开源?

    上次Who的主体是谁"发明"了开源,这一次主体转换,来看看开源发明之后,还有哪些人为开源做贡献?作为普通程序员的我们,又能以怎样的形式参与到开源项目中? 很多人都以为参与开源是一件 ...

  9. 动图演示步骤 Vmware安装Centos-7 最小安装/图形化界面及常见错误参考,基础配置推荐

    程序软件工具安装篇 --[Linux](Vmware/Centos-7) 目录 程序软件工具安装篇 --[Linux](Vmware/Centos-7) ①:文件准备工作 虚拟机工具安装文件 系统镜像 ...

  10. #线段树#洛谷 4588 [TJOI2018]数学计算

    题目传送门 分析 由于曾经做过原题 所以就直接说了,因为每个数最多被除掉一次 所以可以用线段树维护区间乘,也就很简单了,删除就单点修改就行了 代码 #include <cstdio> #i ...