842. 将数组拆分成斐波那契序列

Posted yfs123456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了842. 将数组拆分成斐波那契序列相关的知识,希望对你有一定的参考价值。

给定一个数字字符串 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 拆分出来的所有斐波那契式的序列块,如果不能拆分则返回 []。

示例 1:

输入:"123456579"
输出:[123,456,579]
示例 2:

输入: "11235813"
输出: [1,1,2,3,5,8,13]
示例 3:

输入: "112358130"
输出: []
解释: 这项任务无法完成。
示例 4:

输入:"0123"
输出:[]
解释:每个块的数字不能以零开头,因此 "01","2","3" 不是有效答案。
示例 5:

输入: "1101111"
输出: [110, 1, 111]
解释: 输出 [11,0,11,11] 也同样被接受。
提示:

1 <= S.length <= 200
字符串 S 中只含有数字。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/split-array-into-fibonacci-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

代码有点儿烂,做了好久,超过人数才5点几,真TM fuck。

 1 public class Solution 
 2     private String s;
 3     private int len = -1;
 4     private List<Integer> res;
 5     private int e1;
 6     private int e2;
 7     private int e3;
 8 
 9     private String isContinue(int m,int n,int o)
10         String r = null;
11         String a = s.substring(m, n);
12         String b = s.substring(n, o);
13         if (a.length() > 10 || b.length() > 10)
14             return "";
15         long a0 = Long.parseLong(a);
16         long b0 = Long.parseLong(b);
17         if (a0 > 2147483647 || b0 > 2147483647)
18             return "";
19         e1 = (int)a0;
20         e2 = (int)b0;
21         if (a0+b0 > 2147483647)
22             return "";
23         e3 = (int)(a0+b0);
24         String c = String.valueOf(a0 + b0);
25         if (a.charAt(0)==‘0‘ && a.length()!=1 || b.charAt(0)==‘0‘ && b.length() != 1)
26             r = "";
27         else if (c.length() > len-o)
28             r = "";
29         else if (!s.substring(o,o+c.length()).equals(c))
30             r = "";
31         return (r != null) ? "" : c;
32     
33 
34     private boolean helper(int m, int n, int o)
35         if (isContinue(m,n,o).equals(""))
36             return false;
37         
38 
39         for (int i = n; i < len; i++) 
40             for (int j = i+1; j < len; j++) 
41                 String c = isContinue(m, i, j);
42                 if (c.equals(""))
43                     continue;
44                 if (s.substring(j,j+c.length()).equals(c))
45                     if (c.length() > len-j)
46                         return false;
47 
48                     res.add(e1);
49 
50                     if (c.length() == len-j) 
51                         if (e2 == e1 || res.get(res.size()-1) != e2)
52                             res.add(e2);
53                         res.add(e3);
54                         return true;
55                     
56                     if (helper(i, j, j+c.length()))
57                         return true;
58 
59                     res.remove(res.size()-1);
60                 
61             
62         
63         return false;
64     
65     public List<Integer> splitIntoFibonacci(String S) 
66         s = S;
67         len = s.length();
68         res = new ArrayList<>();
69 
70         for (int i = 1; i < len; i++) 
71             for (int j = i+1; j < len; j++) 
72                 if (helper(0,i,j))
73                     return res;
74             
75         
76         return res;
77     
78 
79     public static void main(String[] args) 
80         List<Integer> integers = new Solution().splitIntoFibonacci("3611537383985343591834441270352104793375145479938855071433500231900737525076071514982402115895535257195564161509167334647108949738176284385285234123461518508746752631120827113919550237703163294909");
81         System.out.println("integers = " + integers);
82     
83 

 

以上是关于842. 将数组拆分成斐波那契序列的主要内容,如果未能解决你的问题,请参考以下文章

最强解析面试题:Goland 并发版斐波那契数列

最强解析面试题:Goland 并发版斐波那契数列

算法动态规划 - 斐波那契数

什么是k阶斐波那契序列?用汉语解释

三、编程题:计算斐波那契分数序列前n项之和。

使用数组和 For 循环的斐波那契数列