[LeetCode]Plus One 优化

题目

Given a non-negative number represented as an array of digits, plus one to the number.
The digits are stored such that the most significant digit is at the head of the list.

题意:一个正整数,它的每一位存放在一个整型数组里,array[0]存放整数的高位。给这个整数加1,返回的结果也放在一个数组里。

代码1

题目简单,需要注意的地方就一个,处理进位。没有什么思考,直接写程序。稍微测试了一下,提交。通过没问题,但是一看执行时间,很受挫折。

class Solution(object):
   
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        r = digits[:]
        n = len(r) 
        one = 1
        for i in range(n-1, -1, -1):
            add = one + r[i]
            one =  add // 10
            q = add % 10
            r[i] = q
            if one == 0:
                break
            
        if one == 1:
            r1 = [1]
            r1.extend(r)
            return r1
        else:
            return r

代码2

考虑了一下,没必要复制列表,把 r = digits[:]改为 r = digits,执行时间有明显改善,但是还不够。

class Solution(object):
    
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        r = digits
        n = len(digits) 
        one = 1
        for i in range(n-1, -1, -1):
            add = one + digits[i]
            one =  add // 10
            q = add % 10
            r[i] = q
            if one == 0:
                break
            
        if one == 1:
            r1 = [1]
            r1.extend(r)
            return r1
        else:
            return r
        

代码3

还有什么地方呢?再找,抱着试一试的态度,因为加1,进位最大为1,可以直接赋值,求余改为用减法。没想到真的有效果,又前进了一步。

class Solution(object):
    
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        r = digits
        n = len(r) 
        one = 1
        for i in range(n-1, -1, -1):
            add = one + r[i]
            if add >= 10 :
                one = 1
                r[i] = add - 10
            else:
                one = 0
                r[i] = add
                break
                
        if one == 1:
            r1 = [1]
            r1.extend(r)
            return r1
        else:
            return r
        

代码4

有想到一个地方,list的extend可能还有空间,试一试改成+号吧,哦,又进了一步。

class Solution(object):
       
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        r = digits
        n = len(r) 
        one = 1
        for i in range(n-1, -1, -1):
            add = one + r[i]
            if add >= 10 :
                one = 1
                r[i] = add - 10
            else:
                one = 0
                r[i] = add
                break
                
        if one == 1:
            return [1] + r
        else:
            return r

再找,再找,可实在想不出来还有什地方可以再改进了。我的最好时间是44ms,前面还有一个40ms和36ms,他们是怎么做到的呢?简单的题目要做好了也不容易!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值