LeetCode:Reverse Integer & PalindromeNumber

 

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的数一定不是回文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值