给定一个数字字符串 S,比如 S = “123456579”,我们可以将它分成斐波那契式的序列 [123, 456, 579]。
形式上,斐波那契式序列是一个非负整数列表 F,且满足:
0 <= F[i] <= 2^31 - 1,(也就是说,每个整数都符合 32 位有符号整数类型);
F.length >= 3;
对于所有的0 <= i < F.length - 2,都有 F[i] + F[i+1] = F[i+2] 成立。
另外,请注意,将字符串拆分成小块时,每个块的数字一定不要以零开头,除非这个块是数字 0 本身。
返回从 S 拆分出来的任意一组斐波那契式的序列块,如果不能拆分则返回 []。
解题思路
Fibonacci 数列可由直接前2个数字确定,所以从 S 依次取2个数字所形成的 Fibonacci 数列和 S 比较是否一样即可。
code
尝试次数:3
要注意F[i] < 2 ^ 31, 被坑了2次,明明测试用例65可以出结果,但是返回是空,没注意到这坑,还提交多一次以为有bug
class Solution:def splitIntoFibonacci(self, S: str) -> List[int]:i1,i2= 1,1def getFibList(num1, num2):numLen = len(str(num1))+len(str(num2))f1,f2 = num1,num2res = [f1,f2]resStr = str(num1)+str(num2)while numLen < len(S):f3 = f1+f2f1,f2 = f2,f3# 这里注意有坑if f3 >= pow(2,31):return [],''res.append(f3)numLen += len(str(f3))resStr+=str(f3)return res, resStrwhile i1+i2<len(S):if i1>1 and S[0] == '0':return []f1 = int(S[0:i1])if f1 >= pow(2,31):breakwhile i1+i2<len(S):if i2>1 and S[i1] == '0':breakf2 = int(S[i1:i1+i2])if f2 >= pow(2,31):breakif resStr == S:return resi2+=1i1 += 1i2 = 1return []
