作者:隋顺意 微信:世界上的霸主 博客:Sui_da_xia
欢迎转载,下载使用
前言:
前段时间发blink,说要写刷力扣,故写此文。算法小白,如有错误,欢迎评论,如有收获,点赞评论,关注最帅(美)。
闲话少说,先来看题。
题目:
来自力扣题库9:https://leetcode-cn.com/problems/palindrome-number/
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
看到这儿,感觉这题太简单,第一反应就是:把数字转换成字符串,倒转字符串。但是,题目又说:
你能不将整数转为字符串来解决这个问题吗?
接下来,我介绍一种~~不作弊~~ 的方法
算法:
想要判断此数是否为回文数,先要知道啥事回文数
举个栗子:
数1234,从右往左读,4321,1234 ≠ 4321,它不是回文数。
数1221,从右往左读,1221,1221 = 1221,它是回文数。
简单思考下,发现所有的负数肯定不是回文数,所以,可以做个小弊。
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
那怎么判断呢?可以先把一个数的的回文数求出来(此处回文数指从右往左读),再比较他的回文数和原数的区别。
既是从右往左读,那第一次去它的个位,第二次取它的百位,第三次取它的千位……一直到它的首位。
如何取它的个位数呢?有个取余符号 “%”。
代码示例
那数 x 举例,第一次取它的个位, 把它赋值给变量c:
c = x % 10。
然后把c从x中减除,并且把减完的x除以10(去除末尾的0):
x -= c
x /= 10
所以,我们就可以轻易的得出:
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
xxx = x
a = 0
b = 1
while x != 0:
c = x % 10
x -= c
a *= 10
a += c
x /= 10
if a == xxx:
return True
else:
return False
好处:
在官方解法里,您会发下他列举了几个特殊情况,分别是"负数",“0” 和"整十数","奇数位数"。之前,我们已经专门讲过负数了。可是,若照官网的解法,还有几种要特别列出。我这个代码是否需要呢?
可以很负责的告诉您,不需要。有兴趣的可以自己实践,这就是我的代码的好处。
坏处:
凡是都有利弊,尽管我的代码可以省下许多额外的考虑,但是速度却很慢。官网的解法是反转这个数一半,这样可以快一倍。我的代码却不行。这也算是坏处吧。
结语:
这就是有关力扣第九题:回文数的解决方法。大家可以使用拷贝的 代码。如果有建议,或者代码有问题,请留言评论。
有收获?点赞,关注吧。
看完记得点赞哦