LeetCode 842. Split Array into Fibonacci Sequence

231 篇文章 0 订阅

Given a string S of digits, such as S = "123456579", we can split it into a Fibonacci-like sequence [123, 456, 579].

Formally, a Fibonacci-like sequence is a list F of non-negative integers such that:

  • 0 <= F[i] <= 2^31 - 1, (that is, each integer fits a 32-bit signed integer type);
  • F.length >= 3;
  • and F[i] + F[i+1] = F[i+2] for all 0 <= i < F.length - 2.

Also, note that when splitting the string into pieces, each piece must not have extra leading zeroes, except if the piece is the number 0 itself.

Return any Fibonacci-like sequence split from S, or return [] if it cannot be done.

Example 1:

Input: "123456579"
Output: [123,456,579]

Example 2:

Input: "11235813"
Output: [1,1,2,3,5,8,13]

Example 3:

Input: "112358130"
Output: []
Explanation: The task is impossible.

Example 4:

Input: "0123"
Output: []
Explanation: Leading zeroes are not allowed, so "01", "2", "3" is not valid.

Example 5:

Input: "1101111"
Output: [110, 1, 111]
Explanation: The output [11, 0, 11, 11] would also be accepted.

Note:

  1. 1 <= S.length <= 200
  2. S contains only digits.

-------------------------------------------------

这题暴露出的问题:

1. 理解错意思,误认为fib的第一个数是0。所以前两个数定了,后面就都定了,枚举前两个数就完了

2. python没有用过startswith

3. python for 循环里的循环变量可以随便改

4. 0的处理有问题,upper写太复杂可以break掉

5. 没有判断整数的范围

6. fib循环的时候没有更新相应的数和str

class Solution:
    def splitIntoFibonacci(self, S: str):
        l = len(S)
        for i in range(1,min(10,l-2)):
            a = S[:i]
            if (a[0] == "0" and i>1):
                break
            for j in range(i+1,min(i+11,l-1)):
                b = S[i:j]
                if (b[0] == "0" and j>i+1):
                    break

                anum,bnum = int(a),int(b)
                cnum = anum+bnum
                res = [anum,bnum]
                c = str(cnum)
                while (cnum <= (1<<31)-1 and S[j:].startswith(c)):
                    res.append(cnum)
                    j += len(c)
                    bnum,cnum = cnum,bnum+cnum
                    c = str(cnum)
                if (j == l):
                    return res
        return []

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值