Given a 32-bit signed integer, reverse digits of an integer.
Example 1: Input: 123 Output: 321;Example 2:Input: -123 Output: -321;Example 3:Input: 120 Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
这道题的要求是翻转一个有符号的整数,主要考虑的问题是整数的符合和溢出的问题。自己又写了一个比较low的代码段。先贴出来
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
sign = (x >= 0)
temp = str(abs(x))
string = [i for i in temp]
string.reverse()
xx = ''
for i in string:
xx = xx + i
value = int(xx)
if sign & (value<=2**31-1):
return value
elif sign & (value>=2**31-1):
return 0
elif (~sign) & (value<=2**31):
return -1*value
else:
return 0
又是对python的一些基本用法不太熟悉,多此一举的把可以直接翻转的字符串转换成了列表再翻转,之后再利用了for训练对其合成,这两步是完全没必要的。还有就是在判断是否溢出时,使用了多个判断语句,而且判断语句中还存在&,其实可以通过提取出整数的符号,操作完之后再合成带符号的整数可以减少判断语句。
修改的第二个版本如下:
sign = 1 if x>=0 else -1
string = str(abs(x))
# string.reverse() #in_place operation
string = string[::-1] # get the other list
value = int(string)
signed_value = sign * value
if -2**31 <= signed_value <= 2**31-1:
return signed_value
else:
return 0
先把符号提取出来了,利用[::-1]操作对字符串进行翻转,最后合成数字,判断是否溢出即可。
把其他人两行完成的版本也贴出来:
r = x // max(1, abs(x)) * int(str(abs(x))[::-1])
return r if r.bit_length() < 32 or r == -2**31 else 0
虽然只有两行,但是可读性比较差。不过采用了 r = x // max(1, abs(x))这个来提取符号是一个比较秀的操作,还有就是python的内置函数r.bit_length()来获取整数用二进制表示需要的位数,只有小于32位,并且在为32位时只能够等于-2**32时的才没有溢出。
这道题里面学习到了:字符串可以利用切片直接翻转;int()函数会自动把字符串中开头位数的零去除‘;判断语句的合成;获取数值符号的方法以及内置函数bit_length()的使用。
Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.
Example 1:Input: 121 Output: true
问题让判断一个数是不是回文,首先想到的想法就是把整数转化为字符串然后对字符串进行翻转,判断是不是相同的。
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
temp = str(x)
string = temp[::-1]
return temp==string
因为负数一定不是回文,可以先提前去掉,然后进行判断。在官方解释中,当数特别大的时候转化为字符串需要占据很大的空间,所以要想办法进行缩减存储空间。回文有个特点,只需要判断后半部分和前半部分相不相同即可。
half = len(str(x))//2
string = str(x)
previous_value = string[:half]
last_value = string[half:]
last_value = last_value[1:] if len(last_value)>len(previous_value) else last_value
return str(previous_value) == str(last_value)[::-1]
分别找出前半部分和后半部分进行判断是否相同即可得到结果,时间复杂度和空间复杂度都稍微缩短了一些。
进阶部分是,不通过转化为字符串来求解该问题,利用求余数和商来求得一半的回文数,再进行判断是否相等。
class Solution:
def isPalindrome(self, x: int) -> bool:
if x ==0 :
return True
elif x < 0 or (x % 10 == 0):
return False
reverse = 0
while(reverse<x):
reverse = reverse *10 + x % 10
x = x // 10
if x != reverse:
reverse = reverse // 10
return x == reverse
得考虑求余数的时候末尾为零时的特殊情况,0是回文,而小于零和末尾为0的数一定不是回文。