边工作边刷题:70天一遍leetcode: day 50

Additive Number

要点:实现题,三层loop:方式是外层确定前2个数的边界i,第二层确定第一个数的边界j。

  • 确定了前两个数后就loop是否为正确序列:这里最好另用个函数,why?
    • 逻辑上False退出循环后要进入下一次,但是True的情况也是从内层循环结束,但不进入下一层。如果用函数,可以直接返回True/False,不用在循环结束通过其他条件判断True/False情况
    • 结构上说外面的2层循环是初始化,而第三层是判断,所以应该用函数分开
  • ‘0’开始的判断的条件:长度>1并且第一个为’0'
  • 省时的要点就是早退出:比如第1+2个数最多到2/3长度

错误点:

  • i从2开始,j从1开始,全表示数的下一个位置。
class Solution(object):
    def isAdditiveNumber(self, num):
        """
        :type num: str
        :rtype: bool
        """
        def helper(num, n1, n2):
            #print num, n1, n2
            k = 0
            while k<len(num):
                res = int(n1)+int(n2)
                n3 = str(res)
                if n3 != num[k:k+len(n3)]:
                    return False
                k+=len(n3)
                n1 = n2
                n2 = n3 # error 3: should be int()
            return True
            
        for i in range(2,len(num)//3*2+1): # not an error2: i is +1 more than right index
            for j in range(1, i):
                num1 = num[:j]
                num2 = num[j:i]
                if len(num1)>1 and num[0]=='0': continue
                if len(num2)>1 and num[j]=='0': continue
                # error 1: j is +1 more than right index
                if helper(num[i:], num1, num2):
                    return True
        return False

posted @ 2016-06-24 04:15  absolute100  阅读(88)  评论(0编辑  收藏  举报