009.回文数
作者:沉默王二 发布时间:2024-01-03T21:52:45.965+0800
-
语雀专栏地址+密码可通过星球置顶帖查看:https://t.zsxq.com/15rEo9Pdu
-
技术派专栏地址:https://paicoding.com/column/7/9
-
这道题可以说完全重写了,给出两道大家完全都能掌握的题解,大家会非常容易掌握,一道中等难度直接变身 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
-
这道题可以说完全重写了,给出两道大家完全都能掌握的题解,大家会非常容易掌握,一道中等难度直接变身 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
-
这道题可以说完全重写了,给出两道大家完全都能掌握的题解,大家会非常容易掌握,一道中等难度直接变身 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