Leetcode007 反转整数

给定一个 32 位有符号整数,将整数中的数字进行反转。

示例 1:

输入: 123
输出: 321

 示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。

一开始完成的版本,尽管变量比较多,但自己觉得写的很清楚。

class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        s = str(x)
        flag = 0 # 0是没有负号
        if s[0] == '-': #有负号
            temp_s = s[1:]
            flag = 1
        else:  # 没有负号
            temp_s = s

        ttemp_s = temp_s[::-1]
        sig = ttemp_s.find('0')
        if sig != -1:
            tttemp_s = ttemp_s[(sig+1):]
        else:
            tttemp_s = ttemp_s

        if flag == 0:
            new_s = tttemp_s
        elif flag == 1:
            new_s = '-' + tttemp_s

        return int(new_s)

主要用到以下几个知识点:

1.列表(字符串)中冒号的用法

网上查到一句话不错:“解释s[i:j:k]是,根据该“片第从i到j与第k步”。何时ij缺席,整个序列是和s[::k]意思是“每k个项目””。

2.找列表的某一个元素的下标

字符串.find()或者字符串.index(),是从正向找某元素

有人说index好,因为它找不到会报异常,而find会返回-1。返回-1不是挺好的嘛,判断一下不就得了……可能是自己水平太渣没领悟到异常精髓吧


第一次提交,报了输入‘0’的错……MD就是说输入本身是0,我却把0都去掉了。整体外围给加一个判断是否为0的if吧。

第二次提交,输入为一个比较大的数,反转以后超过范围了……

输入: 1534236469
输出: 9646324351
预期: 0

所以再给结尾那加个判断好了。

第三次提交,输入为102,应该返回201,我只返回了1。原来是压根没注意数中间有0怎么办。改进一下中间判断find 0的语句

 if sig != -1 :

为:

 if sig != -1 and ttemp_s[0] == 0:

最终通过!可见细节是多么重要。先放自己的源码:

class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x == 0:
            return 0
        else:
            s = str(x)
            flag = 0 # 0是没有负号
            if s[0] == '-': #有负号
                temp_s = s[1:]
                flag = 1
            else:  # 没有负号
                temp_s = s

            ttemp_s = temp_s[::-1]
            sig = ttemp_s.find('0')
            if sig != -1 and ttemp_s[0] == 0:
                tttemp_s = ttemp_s[(sig+1):]
            else:
                tttemp_s = ttemp_s

            if flag == 0:
                new_s = tttemp_s
            elif flag == 1:
                new_s = '-' + tttemp_s

            result = int(new_s)
            if result > (2 ** 31 - 1) or result < -(2 ** 31):
                return 0
            else: return result

网上一个简单一些的写法如下:

class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        b = pow(2, 31)
        if x < 0:
            x = abs(x)
            ans = -int(str(x)[::-1])
        else:
            ans = int(str(x)[::-1])
        if ans >= (-b) and ans <= b-1:
            return ans
        else:
            return 0
主要是直接用输入数字x进行比较。我是转为字符串判断负号又判断0。在leetcode平台试了一下,上边这种方法没有判断尾0,在int转为str后直接反转再转回int居然没有尾0的问题。get到了!

猜你喜欢

转载自blog.csdn.net/u014292401/article/details/80905626