zoukankan      html  css  js  c++  java
  • 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.

    题意为将一个非负数用一个数组表示,数字的最高位存在数组的开头(注意在最开头),所以实际处理的时候是从尾部开始处理,逆序到开头。

    传说中这是谷歌最喜欢的面试题。后序可以拓展出好多问题,比如可以扩展这个到两个数组相加,或者问一些OO设计,假设现在要设计一个BigInteger类,那么需要什么构造函数,然后用什么数据结构好,用数组和链表各有什么优劣势。这些问题虽然不是很难,但是可以考到一些基本的理解,所以平时准备有机会还是可以多想想哈。

    一个比较容易想到的解法就是把Add Binary或者Add Two Numbers这种的通俗解法拿过来,将加的1作为carry进位,逐步判断。代码如下,运行时间48ms:

    class Solution(object):
        def plusOne(self, digits):
            """
            :type digits: List[int]
            :rtype: List[int]
            """
            if not digits:
                return [1]
            carry = 1
            for i in range(len(digits)-1,-1,-1):
                a = digits[i]
                digits[i] = (a+carry)%10
                carry = (a+carry)/10
                
            if carry:
                digits.insert(0,carry)
            return digits

    当然,这个代码可以优化,如当carry为0时,直接返回,如:

    class Solution(object):
        def plusOne(self, digits):
            """
            :type digits: List[int]
            :rtype: List[int]
            """
            if not digits:
                return [1]
            carry = 1
            for i in range(len(digits)-1,-1,-1):
                a = digits[i]
                digits[i] = (a+carry)%10
                carry = (a+carry)/10
                if not carry:
                    return digits
            digits[0]=1
            digits.append(0)
            return digits

    这个优化的代码按理论是运行步数更少的,但是实际运行时间变长为60ms.不过用大数实测时,优化代码确实可以加速不少。

    以上无论是原始解法还是优化代码,其实都没有深入问题,并非problem specific的解法,实际考虑十进制的数,只有当该位置为9时,才会产生进位。并且如果处理到数字的头部依旧存在进位的话,那么原始数字各位都为9,而运算完的结果应该比原始数字多一位,并且开头为1,其余位置都为0。所要进行的操作为在将digits[0]置为1,尾部再添上一个0,代码如下:

    class Solution(object):
        def plusOne(self, digits):
            """
            :type digits: List[int]
            :rtype: List[int]
            """
            if not digits:
                return [1]
            for i in range(len(digits)-1,-1,-1):
                if digits[i] == 9:
                   digits[i] = 0
                else:
                   digits[i] += 1 
                   return digits
    
            digits.append(0)
            digits[0] = 1
            return digits
            
            

    这种不需要进行取余和除法,计算量实际可以得到很大的降低。

  • 相关阅读:
    改变form里面input,textarea.select等的默认样式
    serialize() 方法
    纯css实现互动清单
    less学习笔记
    竖直手风琴导航菜单栏
    植树节快到了-那就种棵决策树吧
    简单写个logictic回归
    爬取纽约时报特定关键词新闻并计数
    (数学建模)非线性规划
    (CV学习笔记)看图说话(Image Captioning)-2
  • 原文地址:https://www.cnblogs.com/sherylwang/p/5442045.html
Copyright © 2011-2022 走看看