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
这种不需要进行取余和除法,计算量实际可以得到很大的降低。
posted on 2016-04-28 11:43 Sheryl Wang 阅读(204) 评论(0) 编辑 收藏 举报