• leetcode--306:(递归) Additive Number


    #2019.5.24: 

    leetcode_2: #306(未解决)很沮丧,今天这个问题没能解决出来,部分网友说回溯法能做,这个高级的算法还没学,之后补充

    题目:累加数

      Additive number is a string whose digits can form additive sequence.

      A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two.

      Given a string containing only digits '0'-'9', write a function to determine if it's an additive number.

    Note: Numbers in the additive sequence cannothave leading zeros, so sequence 1, 2, 03 or 1, 02, 3 is invalid.

    今天学的是https://blog.csdn.net/weixin_37373020/article/details/80567919 的方法:

    def junge(a,b,s):
      c=a+b
      temp=str(a)+str(b)+str(c)
      if s==temp:
        return True
      elif len(s)<len(temp):
        return False
      if s[:len(temp)]==temp:
        return junge(b,c,s[len(str(a)):])
      else:
        return False


    for i in range(1,len(num)//2+1):
      a=int(num[:i])
      j=1
      while j+i<(len(num)+i)//2+1:
        b=int(num[i:i+j])
        if junge(a,b,num):
          return True
        j+=1

    return False

    注意:双斜杠表示地板除,即先做除法(/),然后向下取整(floor)。至少有一方是float型时,结果为float型;两个数都是int型时,结果为int型。

    思考过程:1.坚持一个核心思想“如果一个数字a大于另一个数字b,那么a的位数至少与b一样或者多于b。”所以第一个数的位数一定少于等于字符数的一半。所以第一个数只取num字符数的一半或一半减一

        2.第一个数取一位,取两位……直到num字符数的一半或一半减一不断尝试

        3.第二个数也是取一位,取两位不断尝试

        4.junge是一个递归函数,里面判断第一个数,第二个数,第三个数(假定是第一个数和第二个数的和,然后截取num同长度同位的数与之对比)的关系,满足的话取第二个数,第三个数,第四个数尝试

    难点:第一个数,第二个数的位数是多少,需要做循环试探。

    看到leetcode上最高点赞的回答是:

      算法过程:运用了迭代器的方法取遍第一位数和第二位数的所有可能的组合;利用字符串方法的首字符对比,把可能的结果和原字符串对应位置的数字对比;第一位数,第二位数找到后就可以依次往后轮训对比了。佩服佩服~~

  • 相关阅读:
    BWList of logged on users in the Portal
    BASIS About Profile
    B/S C/S 打印
    程序员得学习观各种好书推荐
    ORACLE面试测试题目
    oracle经典20题(参考答案)
    程序员得学习观各种好书推荐
    Oracle笔试题
    Oracle笔试题
    Oracle里面常用的数据字典有哪些?
  • 原文地址:https://www.cnblogs.com/marvintang1001/p/11171992.html
Copyright © 2020-2023  润新知