给定一个数字字符串 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
暴力查找, 笨方法, 有待修改
遇到bug的地方
1.要求return int list,跑的时候提取数字后先用long接收,因为有test case 会超过int 的范围,用int会报formate错。
2.StringIndexOutOfBoundsException, 每次更新position的时候,都要注意提取substring的时候有没有超出,每一个substring的起始和终止位置都要test,因为可能其中一个都超出了,或者两个都超出。
3.算法是暴力查找,Ex://4位+5位 = 5位 or 6 位
每次都会核对Max digit 位数的下一个值和Max digit+1位数的下一个值,有一个特殊case,6位的值超出了界限,而5位没有(上面例子),恰巧5位的值等于前两个的和,这种情况是应该继续,因为有一个符合条件。
4.先判断超出是否超出renge,然后再判断是不是再int范围。有一次报错是因为先用了long接收,但是再提取substring的时候,超出了range
class Solution {
public List<Integer> splitIntoFibonacci(String S) {
int length = S.length();
int a = 1;
int b = 1;
//2个for loop 所以效率是O(n^2),但是每一个只要运行length/2+1 的范围,因为斐波那契序列 前一项加后想一项的结果的位数至少是和位数最多的一个加数相同的
//1位+1位 = 1位 or 2 位
//1位+5位 = 5位 or 6 位
for(;a < length/2+1;a++){
if(a>10){
break;
}
List<Integer> list1 = new ArrayList<Integer>();
int pos1 = 0;
b=1;
int record= a;
for(;b< length/2+1;b++){
int fir;
int sec;
int thir;
int forth;
long outOfrange;
int c = Math.max(a, b);
if(pos1+a > length ||pos1> length ){
//we need to check if out of bound
fir = 0;}
else{
//this is for checking if the value is greater than 2^31-1, we can not use int, so //use long to get the value and then cast to int if less
outOfrange = Long.parseLong(S.substring(pos1,pos1+a));
if(outOfrange>2147483647){
break;
}
fir = (int)outOfrange;
}
if(pos1+a+b > length||pos1+a> length){
sec = 0;}
else{
outOfrange =Long.parseLong(S.substring(pos1+a,pos1+a+b));
if(outOfrange>2147483647){
break;
}
sec = (int)outOfrange;
}
if(pos1+a+b+c > length||pos1+a+b> length ){
thir = 0;}
else{
outOfrange = Long.parseLong(S.substring(pos1+a+b,pos1+a+b+c));
if(outOfrange>2147483647){
break;
}
thir = (int)outOfrange;
}
if(pos1+a+b+c+1 > length||pos1+a+b> length ){
forth = 0;
}
else{
outOfrange =Long.parseLong(S.substring(pos1+a+b,pos1+a+b+c+1));
//check 是否超过int range
if(outOfrange>2147483647){
forth = 0;
}
else{
forth = (int)outOfrange;}
}
helper run = new helper();
int res = run.check(fir+ sec,thir,forth);
if (res == thir || res == forth) {
list1.add(fir);
int len2 = String.valueOf(res).length();
if(pos1+a+b+len2 >= length){
list1.add(sec);
list1.add(res);
return list1;
}
pos1 = pos1 + a;
a = b;
b =len2 -1;
}
}
a = record;
}
return new ArrayList<Integer>();
}
}
class helper{
public int check(int a , int b , int c){
if(a == b){
return b;
}
else if(a == c){
return c;
}
else{
return -1;
}
}
}
通过 4 ms 35.9 MB Java