7602 字
约 25 分钟
1
009.回文数
无标签

009.回文数

作者:沉默王二 发布时间:2024-01-03T21:52:45.965+0800


  • 语雀专栏地址+密码可通过星球置顶帖查看:https://t.zsxq.com/15rEo9Pdu

  • 技术派专栏地址:https://paicoding.com/column/7/9

  • 星球原地址:https://t.zsxq.com/15LV14mNA

  • 这道题可以说完全重写了,给出两道大家完全都能掌握的题解,大家会非常容易掌握,一道中等难度直接变身 easy 难度。

  • 增加代码注释,这样大家更容易看懂并掌握题解;

  • 增加参考资料,这样大家可以从零基础直接开刷,减轻新手刷题的阻力;

  • 增加手绘图,这样大家更容易理解解题思路;

  • 增加 ACM 输入输出,这样大家可以在 Intellij IDEA 中进行调试;

  • 增加题解模拟,这样大家可以根据题解模拟整个题解过程,看完会有一种“哦哦”恍然大悟的感觉;

  • 图片上传至 OSS 并配合 CDN,提升大家在技术派网站中的阅读体感。

  • 另外,这一版本会作为 PDF 的终稿随后在星球进行发布。

鲁迅说过,我不知道什么是算法,但是我知道二哥写的 LeetCode 题解真不错。

题意

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

示例

输入:x=121
输入:x=-121

解释:从左向右读,为-121。从右向左读,为121-。因此它不是一个回文数。

输入:x=10

解释:从右向左读,为01。因此它不是一个回文数。

分析

读完这道题目,我们需要先搞清楚什么是回文,回文就是正着读和反着读都是一样的,比如 121,12321,1234321 等等,那么我们如何判断一个数是不是回文数呢?

我第一时间想到的是将数字转成字符串,然后通过 StringBuilder 的 reverse() 方法来翻转字符串,最后**比较两个字符串是否相等 **,如果相等的话,就说明是回文数,否则就不是回文数。

class Solution {
	// 数字转字符串		String str = String.valueOf(x);		// 把字符串放入 StringBuilder 中		StringBuilder sb = new StringBuilder(str);		// 利用 StringBuilder 的 reverse() 方法翻转字符串		// 然后调用 equals() 方法比较两个字符串是否相等		return sb.reverse().toString().equals(str);	}}

咦,竟然能打败 30% 的 Java 用户,别骗我啊,这么简单的题,这么低的效率,我不信。

当然了,看似简单的代码背后,其实蕴藏了很多玄机,我们来分析一下。

①、String.valueOf(x)

这个方法可以把整数转成字符串,我在《二哥的 Java 进阶之路 》上曾讲过这个方法。

当然了,也可以通过 x + "" 来完成转换,不过 + 号操作符的背后,其实调用的是 StringBuilder 的 append() 方法。

这个我们在讲**字符串拼接 **时曾讲过,不知道大家还记得不?

那后面我们其实又 new 了一个 StringBuilder 对象,所以这里就直接采用 String.valueOf(x) 来完成转换了。

②、StringBuilder sb = new StringBuilder(str);

这里我们把字符串放入 StringBuilder 中,这个也是我在《二哥的 Java 进阶之路 》上曾讲过的,不知道大家还记得不?

包括 reverse() 方法,前面的**题解 007.整数反转 ** 也讲过了,这里就不再赘述了。

③、equals(str)

比较两个字符串是否相等,这个我在《二哥的 Java 进阶之路 》上也曾讲过了,源码也带着大家分析过。

分析 2

前面我们反转的是整个数字,那其实我们可以只反转一半的数字,比如 1234321,我们只需要反转后面一半的数字 321,然后和前面一半的数字 123 进行比较,如果相等,就说明是回文数,否则就不是回文数。

奇数的话去掉中间的数字。

来看题解,主要用到的还是乘法、取余和除法:

class Solution {
    // 负数不是回文数        // 如果数字的最后一位是0,为了使该数字为回文,        // 则其第一位数字也应该是0,只有0满足这一属性        if (x < 0 || (x % 10 == 0 && x != 0)) {            return false;        }
    int revertedNumber = 0;        while (x > revertedNumber) {            revertedNumber = revertedNumber * 10 + x % 10;            x /= 10;        }
    // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。        // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,        // 由于中间的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。        return x == revertedNumber || x == revertedNumber / 10;    }}- **处理特殊情况**:
  • 负数不是回文数,因为有负号。
  • 如果一个数的最后一位是 0,要使其为回文,则第一位数字也必须是 0。唯一满足这个条件的数字就是 0。
  • 反转一半的数字
  • 我们通过 while 循环将最后一位数字移动到 reversedNumber 的末尾,同时将原始数字除以 10,来反转数字的后半部分。
  • 当原始数字小于或等于反转后的数字时,意味着我们已经处理了一半或超过一半的数字。
  • 比较前半部分和后半部分
  • 如果数字的长度是偶数,反转后的数字应与剩余的原始数字相等。
  • 如果数字长度是奇数,则通过将反转后的数字除以 10 去除中间的数字,然后比较剩余部分。

我们来模拟一下整个题解的过程,比如 1234321:

当输入的数字是 1234321 时,我们来模拟一下判断回文数的过程。按照之前提供的算法,我们将逐步反转数字的后半部分,并与前半部分进行比较。

初始状态

  • 原始数字 x = 1234321
  • 反转后的数字 revertedNumber = 0

迭代过程

  • 第一次迭代
  • 取 x 的最后一位:1234321 % 10 = 1
  • 将这一位加入 revertedNumber:revertedNumber = 0 * 10 + 1 = 1
  • 去掉 x 的最后一位:x = 1234321 / 10 = 123432
  • 此时,x = 123432,revertedNumber = 1。
  • 第二次迭代
  • 取 x 的最后一位:123432 % 10 = 2
  • 更新 revertedNumber:revertedNumber = 1 * 10 + 2 = 12
  • 更新 x:x = 123432 / 10 = 12343
  • 此时,x = 12343,revertedNumber = 12。
  • 第三次迭代
  • 取 x 的最后一位:12343 % 10 = 3
  • 更新 revertedNumber:revertedNumber = 12 * 10 + 3 = 123
  • 更新 x:x = 12343 / 10 = 1234
  • 此时,x = 1234,revertedNumber = 123。
  • 第四次迭代
  • 取 x 的最后一位:1234 % 10 = 4
  • 更新 revertedNumber:revertedNumber = 123 * 10 + 4 = 1234
  • 更新 x:x = 1234 / 10 = 123
  • 此时,x = 123,revertedNumber = 1234。

结束条件

在第四次迭代后,x(123)不再大于 revertedNumber(1234)。此时我们停止迭代。

比较前后半部分

  • 现在,我们比较 x 和 revertedNumber / 10(1234 / 10 = 123)。
  • 由于 x == revertedNumber / 10(123 == 123),我们可以判断输入的数字是回文数。

很好理解,我们来看一下题解效率:

咦,竟然只打败了 55% 的 Java 用户,看来还有优化的空间啊!

不应该啊,代码没有优化的空间了呀,把代码注释全部删掉,然后再执行一遍。

好家伙,这次直接打败 98% 的 Java 用户了,看来注释也是有代价的,哈哈哈。

LeetCode 这波计算方式,我只能说服了,不过为了让大家更好的理解代码,所以我还是会保留注释的。

总结

这道题目,我觉得最重要的就是理解题意,然后就是理解回文数的含义。

不管是用字符串来解决,还是用数学方法来解决,我觉得都是可以的。

Java 的优势不就是 JDK 帮我们提供了无数牛逼的 API 吗?如果不用的话,学 Java 干嘛?直接学 C语言不就行了?

简单梳理一下我们用到的基础知识:

  • String.valueOf(x):把整数转成字符串,我在介绍**字符串源码 **的时候讲过。
  • reverse():字符串反转,我在介绍**StringBuilder **的时候讲过。
  • equals():比较两个字符串是否相等,我在介绍**equals()与== **的时候讲过。

当然了,要想学好算法,数学还是要好一点,这样才能更好地运用乘法、取余和除法来解决问题。

力扣链接:https://leetcode.cn/problems/palindrome-number/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

该题解目前只针对**二哥编程星球 **的球友开放,如果你也想一起打卡学习算法的话,扫下面的优惠券加入我们吧,星球目前 4200+ 人,定价 149 元,从当初的 99 元一路涨上来的,所以早就是优势,别再犹豫了。

(优惠券仅 300 张,数量有限)

一个人可以走得很快,但一群人才能走得更远。如果想去面中大厂的话,LeetCode 几乎是必刷的,二哥的 LeetCode 题解通俗易懂、图文并茂,理解给你举一反三的解题能力,冲鸭。

    - 语雀专栏地址+密码可通过星球置顶帖查看:[https://t.zsxq.com/15rEo9Pdu](https://t.zsxq.com/15rEo9Pdu)
  • 技术派专栏地址:https://paicoding.com/column/7/9

  • 星球原地址:https://t.zsxq.com/15LV14mNA

  • 这道题可以说完全重写了,给出两道大家完全都能掌握的题解,大家会非常容易掌握,一道中等难度直接变身 easy 难度。

  • 增加代码注释,这样大家更容易看懂并掌握题解;

  • 增加参考资料,这样大家可以从零基础直接开刷,减轻新手刷题的阻力;

  • 增加手绘图,这样大家更容易理解解题思路;

  • 增加 ACM 输入输出,这样大家可以在 Intellij IDEA 中进行调试;

  • 增加题解模拟,这样大家可以根据题解模拟整个题解过程,看完会有一种“哦哦”恍然大悟的感觉;

  • 图片上传至 OSS 并配合 CDN,提升大家在技术派网站中的阅读体感。

  • 另外,这一版本会作为 PDF 的终稿随后在星球进行发布。

鲁迅说过,我不知道什么是算法,但是我知道二哥写的 LeetCode 题解真不错。

题意

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

示例

输入:x=121
输入:x=-121

解释:从左向右读,为-121。从右向左读,为121-。因此它不是一个回文数。

输入:x=10

解释:从右向左读,为01。因此它不是一个回文数。

分析

读完这道题目,我们需要先搞清楚什么是回文,回文就是正着读和反着读都是一样的,比如 121,12321,1234321 等等,那么我们如何判断一个数是不是回文数呢?

我第一时间想到的是将数字转成字符串,然后通过 StringBuilder 的 reverse() 方法来翻转字符串,最后**比较两个字符串是否相等 **,如果相等的话,就说明是回文数,否则就不是回文数。

class Solution {
	// 数字转字符串		String str = String.valueOf(x);		// 把字符串放入 StringBuilder 中		StringBuilder sb = new StringBuilder(str);		// 利用 StringBuilder 的 reverse() 方法翻转字符串		// 然后调用 equals() 方法比较两个字符串是否相等		return sb.reverse().toString().equals(str);	}}

咦,竟然能打败 30% 的 Java 用户,别骗我啊,这么简单的题,这么低的效率,我不信。

当然了,看似简单的代码背后,其实蕴藏了很多玄机,我们来分析一下。

①、String.valueOf(x)

这个方法可以把整数转成字符串,我在《二哥的 Java 进阶之路 》上曾讲过这个方法。

当然了,也可以通过 x + "" 来完成转换,不过 + 号操作符的背后,其实调用的是 StringBuilder 的 append() 方法。

这个我们在讲**字符串拼接 **时曾讲过,不知道大家还记得不?

那后面我们其实又 new 了一个 StringBuilder 对象,所以这里就直接采用 String.valueOf(x) 来完成转换了。

②、StringBuilder sb = new StringBuilder(str);

这里我们把字符串放入 StringBuilder 中,这个也是我在《二哥的 Java 进阶之路 》上曾讲过的,不知道大家还记得不?

包括 reverse() 方法,前面的**题解 007.整数反转 ** 也讲过了,这里就不再赘述了。

③、equals(str)

比较两个字符串是否相等,这个我在《二哥的 Java 进阶之路 》上也曾讲过了,源码也带着大家分析过。

分析 2

前面我们反转的是整个数字,那其实我们可以只反转一半的数字,比如 1234321,我们只需要反转后面一半的数字 321,然后和前面一半的数字 123 进行比较,如果相等,就说明是回文数,否则就不是回文数。

奇数的话去掉中间的数字。

来看题解,主要用到的还是乘法、取余和除法:

class Solution {
    // 负数不是回文数        // 如果数字的最后一位是0,为了使该数字为回文,        // 则其第一位数字也应该是0,只有0满足这一属性        if (x < 0 || (x % 10 == 0 && x != 0)) {            return false;        }
    int revertedNumber = 0;        while (x > revertedNumber) {            revertedNumber = revertedNumber * 10 + x % 10;            x /= 10;        }
    // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。        // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,        // 由于中间的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。        return x == revertedNumber || x == revertedNumber / 10;    }}- **处理特殊情况**:
  • 负数不是回文数,因为有负号。
  • 如果一个数的最后一位是 0,要使其为回文,则第一位数字也必须是 0。唯一满足这个条件的数字就是 0。
  • 反转一半的数字
  • 我们通过 while 循环将最后一位数字移动到 reversedNumber 的末尾,同时将原始数字除以 10,来反转数字的后半部分。
  • 当原始数字小于或等于反转后的数字时,意味着我们已经处理了一半或超过一半的数字。
  • 比较前半部分和后半部分
  • 如果数字的长度是偶数,反转后的数字应与剩余的原始数字相等。
  • 如果数字长度是奇数,则通过将反转后的数字除以 10 去除中间的数字,然后比较剩余部分。

我们来模拟一下整个题解的过程,比如 1234321:

当输入的数字是 1234321 时,我们来模拟一下判断回文数的过程。按照之前提供的算法,我们将逐步反转数字的后半部分,并与前半部分进行比较。

初始状态

  • 原始数字 x = 1234321
  • 反转后的数字 revertedNumber = 0

迭代过程

  • 第一次迭代
  • 取 x 的最后一位:1234321 % 10 = 1
  • 将这一位加入 revertedNumber:revertedNumber = 0 * 10 + 1 = 1
  • 去掉 x 的最后一位:x = 1234321 / 10 = 123432
  • 此时,x = 123432,revertedNumber = 1。
  • 第二次迭代
  • 取 x 的最后一位:123432 % 10 = 2
  • 更新 revertedNumber:revertedNumber = 1 * 10 + 2 = 12
  • 更新 x:x = 123432 / 10 = 12343
  • 此时,x = 12343,revertedNumber = 12。
  • 第三次迭代
  • 取 x 的最后一位:12343 % 10 = 3
  • 更新 revertedNumber:revertedNumber = 12 * 10 + 3 = 123
  • 更新 x:x = 12343 / 10 = 1234
  • 此时,x = 1234,revertedNumber = 123。
  • 第四次迭代
  • 取 x 的最后一位:1234 % 10 = 4
  • 更新 revertedNumber:revertedNumber = 123 * 10 + 4 = 1234
  • 更新 x:x = 1234 / 10 = 123
  • 此时,x = 123,revertedNumber = 1234。

结束条件

在第四次迭代后,x(123)不再大于 revertedNumber(1234)。此时我们停止迭代。

比较前后半部分

  • 现在,我们比较 x 和 revertedNumber / 10(1234 / 10 = 123)。
  • 由于 x == revertedNumber / 10(123 == 123),我们可以判断输入的数字是回文数。

很好理解,我们来看一下题解效率:

咦,竟然只打败了 55% 的 Java 用户,看来还有优化的空间啊!

不应该啊,代码没有优化的空间了呀,把代码注释全部删掉,然后再执行一遍。

好家伙,这次直接打败 98% 的 Java 用户了,看来注释也是有代价的,哈哈哈。

LeetCode 这波计算方式,我只能说服了,不过为了让大家更好的理解代码,所以我还是会保留注释的。

总结

这道题目,我觉得最重要的就是理解题意,然后就是理解回文数的含义。

不管是用字符串来解决,还是用数学方法来解决,我觉得都是可以的。

Java 的优势不就是 JDK 帮我们提供了无数牛逼的 API 吗?如果不用的话,学 Java 干嘛?直接学 C语言不就行了?

简单梳理一下我们用到的基础知识:

  • String.valueOf(x):把整数转成字符串,我在介绍**字符串源码 **的时候讲过。
  • reverse():字符串反转,我在介绍**StringBuilder **的时候讲过。
  • equals():比较两个字符串是否相等,我在介绍**equals()与== **的时候讲过。

当然了,要想学好算法,数学还是要好一点,这样才能更好地运用乘法、取余和除法来解决问题。

力扣链接:https://leetcode.cn/problems/palindrome-number/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

该题解目前只针对**二哥编程星球 **的球友开放,如果你也想一起打卡学习算法的话,扫下面的优惠券加入我们吧,星球目前 4200+ 人,定价 149 元,从当初的 99 元一路涨上来的,所以早就是优势,别再犹豫了。

(优惠券仅 300 张,数量有限)

一个人可以走得很快,但一群人才能走得更远。如果想去面中大厂的话,LeetCode 几乎是必刷的,二哥的 LeetCode 题解通俗易懂、图文并茂,理解给你举一反三的解题能力,冲鸭。

    - 语雀专栏地址+密码可通过星球置顶帖查看:[https://t.zsxq.com/15rEo9Pdu](https://t.zsxq.com/15rEo9Pdu)
  • 技术派专栏地址:https://paicoding.com/column/7/9

  • 星球原地址:https://t.zsxq.com/15LV14mNA

  • 这道题可以说完全重写了,给出两道大家完全都能掌握的题解,大家会非常容易掌握,一道中等难度直接变身 easy 难度。

  • 增加代码注释,这样大家更容易看懂并掌握题解;

  • 增加参考资料,这样大家可以从零基础直接开刷,减轻新手刷题的阻力;

  • 增加手绘图,这样大家更容易理解解题思路;

  • 增加 ACM 输入输出,这样大家可以在 Intellij IDEA 中进行调试;

  • 增加题解模拟,这样大家可以根据题解模拟整个题解过程,看完会有一种“哦哦”恍然大悟的感觉;

  • 图片上传至 OSS 并配合 CDN,提升大家在技术派网站中的阅读体感。

  • 另外,这一版本会作为 PDF 的终稿随后在星球进行发布。

鲁迅说过,我不知道什么是算法,但是我知道二哥写的 LeetCode 题解真不错。

题意

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

示例

输入:x=121
输入:x=-121

解释:从左向右读,为-121。从右向左读,为121-。因此它不是一个回文数。

输入:x=10

解释:从右向左读,为01。因此它不是一个回文数。

分析

读完这道题目,我们需要先搞清楚什么是回文,回文就是正着读和反着读都是一样的,比如 121,12321,1234321 等等,那么我们如何判断一个数是不是回文数呢?

我第一时间想到的是将数字转成字符串,然后通过 StringBuilder 的 reverse() 方法来翻转字符串,最后**比较两个字符串是否相等 **,如果相等的话,就说明是回文数,否则就不是回文数。

class Solution {
	// 数字转字符串		String str = String.valueOf(x);		// 把字符串放入 StringBuilder 中		StringBuilder sb = new StringBuilder(str);		// 利用 StringBuilder 的 reverse() 方法翻转字符串		// 然后调用 equals() 方法比较两个字符串是否相等		return sb.reverse().toString().equals(str);	}}

咦,竟然能打败 30% 的 Java 用户,别骗我啊,这么简单的题,这么低的效率,我不信。

当然了,看似简单的代码背后,其实蕴藏了很多玄机,我们来分析一下。

①、String.valueOf(x)

这个方法可以把整数转成字符串,我在《二哥的 Java 进阶之路 》上曾讲过这个方法。

当然了,也可以通过 x + "" 来完成转换,不过 + 号操作符的背后,其实调用的是 StringBuilder 的 append() 方法。

这个我们在讲**字符串拼接 **时曾讲过,不知道大家还记得不?

那后面我们其实又 new 了一个 StringBuilder 对象,所以这里就直接采用 String.valueOf(x) 来完成转换了。

②、StringBuilder sb = new StringBuilder(str);

这里我们把字符串放入 StringBuilder 中,这个也是我在《二哥的 Java 进阶之路 》上曾讲过的,不知道大家还记得不?

包括 reverse() 方法,前面的**题解 007.整数反转 ** 也讲过了,这里就不再赘述了。

③、equals(str)

比较两个字符串是否相等,这个我在《二哥的 Java 进阶之路 》上也曾讲过了,源码也带着大家分析过。

分析 2

前面我们反转的是整个数字,那其实我们可以只反转一半的数字,比如 1234321,我们只需要反转后面一半的数字 321,然后和前面一半的数字 123 进行比较,如果相等,就说明是回文数,否则就不是回文数。

奇数的话去掉中间的数字。

来看题解,主要用到的还是乘法、取余和除法:

class Solution {
    // 负数不是回文数        // 如果数字的最后一位是0,为了使该数字为回文,        // 则其第一位数字也应该是0,只有0满足这一属性        if (x < 0 || (x % 10 == 0 && x != 0)) {            return false;        }
    int revertedNumber = 0;        while (x > revertedNumber) {            revertedNumber = revertedNumber * 10 + x % 10;            x /= 10;        }
    // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。        // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,        // 由于中间的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。        return x == revertedNumber || x == revertedNumber / 10;    }}- **处理特殊情况**:
  • 负数不是回文数,因为有负号。
  • 如果一个数的最后一位是 0,要使其为回文,则第一位数字也必须是 0。唯一满足这个条件的数字就是 0。
  • 反转一半的数字
  • 我们通过 while 循环将最后一位数字移动到 reversedNumber 的末尾,同时将原始数字除以 10,来反转数字的后半部分。
  • 当原始数字小于或等于反转后的数字时,意味着我们已经处理了一半或超过一半的数字。
  • 比较前半部分和后半部分
  • 如果数字的长度是偶数,反转后的数字应与剩余的原始数字相等。
  • 如果数字长度是奇数,则通过将反转后的数字除以 10 去除中间的数字,然后比较剩余部分。

我们来模拟一下整个题解的过程,比如 1234321:

当输入的数字是 1234321 时,我们来模拟一下判断回文数的过程。按照之前提供的算法,我们将逐步反转数字的后半部分,并与前半部分进行比较。

初始状态

  • 原始数字 x = 1234321
  • 反转后的数字 revertedNumber = 0

迭代过程

  • 第一次迭代
  • 取 x 的最后一位:1234321 % 10 = 1
  • 将这一位加入 revertedNumber:revertedNumber = 0 * 10 + 1 = 1
  • 去掉 x 的最后一位:x = 1234321 / 10 = 123432
  • 此时,x = 123432,revertedNumber = 1。
  • 第二次迭代
  • 取 x 的最后一位:123432 % 10 = 2
  • 更新 revertedNumber:revertedNumber = 1 * 10 + 2 = 12
  • 更新 x:x = 123432 / 10 = 12343
  • 此时,x = 12343,revertedNumber = 12。
  • 第三次迭代
  • 取 x 的最后一位:12343 % 10 = 3
  • 更新 revertedNumber:revertedNumber = 12 * 10 + 3 = 123
  • 更新 x:x = 12343 / 10 = 1234
  • 此时,x = 1234,revertedNumber = 123。
  • 第四次迭代
  • 取 x 的最后一位:1234 % 10 = 4
  • 更新 revertedNumber:revertedNumber = 123 * 10 + 4 = 1234
  • 更新 x:x = 1234 / 10 = 123
  • 此时,x = 123,revertedNumber = 1234。

结束条件

在第四次迭代后,x(123)不再大于 revertedNumber(1234)。此时我们停止迭代。

比较前后半部分

  • 现在,我们比较 x 和 revertedNumber / 10(1234 / 10 = 123)。
  • 由于 x == revertedNumber / 10(123 == 123),我们可以判断输入的数字是回文数。

很好理解,我们来看一下题解效率:

咦,竟然只打败了 55% 的 Java 用户,看来还有优化的空间啊!

不应该啊,代码没有优化的空间了呀,把代码注释全部删掉,然后再执行一遍。

好家伙,这次直接打败 98% 的 Java 用户了,看来注释也是有代价的,哈哈哈。

LeetCode 这波计算方式,我只能说服了,不过为了让大家更好的理解代码,所以我还是会保留注释的。

总结

这道题目,我觉得最重要的就是理解题意,然后就是理解回文数的含义。

不管是用字符串来解决,还是用数学方法来解决,我觉得都是可以的。

Java 的优势不就是 JDK 帮我们提供了无数牛逼的 API 吗?如果不用的话,学 Java 干嘛?直接学 C语言不就行了?

简单梳理一下我们用到的基础知识:

  • String.valueOf(x):把整数转成字符串,我在介绍**字符串源码 **的时候讲过。
  • reverse():字符串反转,我在介绍**StringBuilder **的时候讲过。
  • equals():比较两个字符串是否相等,我在介绍**equals()与== **的时候讲过。

当然了,要想学好算法,数学还是要好一点,这样才能更好地运用乘法、取余和除法来解决问题。

力扣链接:https://leetcode.cn/problems/palindrome-number/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

该题解目前只针对**二哥编程星球 **的球友开放,如果你也想一起打卡学习算法的话,扫下面的优惠券加入我们吧,星球目前 4200+ 人,定价 149 元,从当初的 99 元一路涨上来的,所以早就是优势,别再犹豫了。

(优惠券仅 300 张,数量有限)

一个人可以走得很快,但一群人才能走得更远。如果想去面中大厂的话,LeetCode 几乎是必刷的,二哥的 LeetCode 题解通俗易懂、图文并茂,理解给你举一反三的解题能力,冲鸭。

            知识星球
            
    
    
        
        扫码加入星球
        查看更多优质内容
    
    https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=15522885221412
009.回文数
http://www.clxhxhhr.top/posts/2434/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。
文章目录