Leetcode9: Palindrome Number


一个回数的题目.......点进去的时候觉得很简单,数字转字符串,分分钟搞定。。。。

结果一看补充说明,懵逼了,不准使用额外空间。。注意整数溢出问题

不准使用额外空间,那就不能重新给string申请空间了。。。那怎么做呢。。。


代码如下

class Solution(object):
	def isPalindrome(self, x):
		"""
		:type x: int
		:rtype: bool
		"""
		if 0<= x <10:        #如果数字是0到9的值,直接返回True
			return True
		if x>0 and x%10==0:  #如果x是10的倍数的整数,那直接返回False,因为末尾是0的情况下,不可能是回数
			return False
		remainder=0          #设置余数=0
		while x > remainder:      #这道题目的关键点,将数字分为前后2部分,前半部分是x,后半部分是remainder
					#如果是偶数位数字的话,前半部分和后半部分对半开,并且相等,也能跳出while循环
					#如果是奇数位数字的话,当前半部分小于后半部分的时候,跳出循环
			remainder = remainder + x%10    #每次循环,将前半部分的位数通过取余数提取出来
							#在下一次循环中,通过上一轮的余数×10,再加上本轮的提取出的余数,可以实现倒转
			x=x//10         #提取完余数以后,前半部分向前进一位,方式是通过地板除取整
		print (remainder,x)
		return x==remainder or x==remainder//10  #这是第二个关键点,如果是偶数位数字,那通过反转的后半部分和前半部分应该一样
							#如果是奇数位的数字的话,将后半部分再次地板除10,这样就能剔除最后一位
							#为什么可以提出最后一位呢?因为作为奇数位的数字来说,中间值是不需要比较的



上面那个是将数字对半开的方法

有点类似,下面的方法是将数字完全地倒转过来

class Solution(object):
	def isPalindrome(self, x):
		"""
		:type x: int
		:rtype: bool
		"""
		original = x   #复制一份原始x
		reverse = 0    #倒转数字初始为0
		if x <0:       #如果x是负数,直接返回False
			return False
		if x!=0 and x%10==0:    #如果x是正数,且能被10整除,返回False
			return False		
		while x>0:              #x>0的意思是,原始值还有位数没有被取干净,还有剩余位数
			reverse = reverse*10 + x%10  #通过取余数来倒转数字
			x=x//10                     #每次地板除以后取整
		return reverse == original       #比较倒转后的数字和初始数字




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值