题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
你能不将整数转为字符串来解决这个问题吗?
规则示例
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
解题分析一:最简单的字符串首尾判断
我们将一个数转换为字符串,然后首尾比较,如果不同则为false
1.将数字转换为字符串
2.遍历该字符串,遍历次数 < length / 2。
奇数个字符不用判断中间;偶数个字符中间两个刚好能比较
3.每次循环首尾比较,不同则为false
解题一:最简单的字符串首尾判断
我们目前已经完成了这道题,但是使用的是题目中不允许的字符串方法。那么接下来我们来思考如何不使用字符串来解题!
解题分析二:将数字倒置后和原数比较
主要思路:将数字利用数学计算翻转,和原数字进行比较
举例:123321
我们的目的是用一个新的数字记录翻转后的数字
那我们应该如何将其翻转呢?
1.取出个位,取后抛弃个位
第一次:123321 % 10 = 1,123321 / 10 = 12332
第二次:12332 % 10 = 2, 12332 / 10 = 1233
第三次:1233 % 10 = 3, 1233 / 10 = 123
第四次:123 % 10 = 3, 123 / 10 = 12
第五次:12 % 10 = 2, 12 / 10 = 1
第六次:1 % 10 = 1, 1 / 10 = 0
通过这几次计算,当最后得到0时就可以停止了,证明我们已经从个位开始把每一位都单独提取了出来,那么我们只需要将其组合成一个新的数就可以和原数比较了
2.用一个数记录取出的数,每次记录时将个位空出来
int reverseNum = 0;
第一次:reverseNum * 10 + 1 = 1
第二次:reverseNum * 10 + 2 = 12
第三次:reverseNum * 10 + 3 = 123
第四次:reverseNum * 10 + 3 = 1233
第五次:reverseNum * 10 + 2 = 12332
第六次:reverseNum * 10 + 1 = 123321
3.用得到的倒序数字和原数字比较即可
解题二:将数字倒置后和原数比较
现在我们已经没有使用字符串解出了该题,但是在此基础上,我们是否还可以再进一步优化呢?
比如,在取出倒序数字时,我们真的有必要取完吗?
那么这个问题就留给大家自己思考一下,在此倒序判断的基础上再次进行优化,可以把你的答案以留言的形式分享给大家哦。
END