每天一道演算法題(將數拆分成斐波那契序列)
這道題其實並不難,斐波那契序列裡面起作用的也就是前兩個數,第一個和第二個數確定了,那麼整個數列就確定了,那麼後面我們只需要驗證就可以了,
思路:我們可以迴圈取前兩個數,然後驗證後面的數是否符合要求,如果符合則輸出,不符合進行下一次驗證
那麼我們可以用Stack來存數虛擬碼如下:
for(int i = 0 ; i < s.length()-2 ; i++) {
Integer first = Integer.parseInt(s.substring(0 , i+1));
list.clear();
list.add(first);
for(int j = i ; j < s.length() - 2 ; j++) {
Integer second = Integer.parseInt(s.substring(i+1 , j+2)) ;
list.add(second);
boolean flag = checkNum(first, second, j+2, s);
if(flag && list.size() > 2) {
System.out.println("this is result"+list);
}
list.clear();
list.add(first);
}
}
我們迴圈的確定第一個數和第二個數,然後驗證後面的數,驗證可以用遞迴方式
private static boolean checkNum(Integer first , Integer second , int index , String s) {
if(first == null
|| second == null
||index > s.length()) {
return false;
}
if(index==s.length()) {
return true;
}
String other = String.valueOf(first+second) ;
if(index+other.length() > s.length()) {
return false;
}
if(other.equals(s.substring(index, index+other.length()))) {
list.add(first+second);
return checkNum(second, first+second, index+other.length(), s);
}
return false ;
}
驗證也比較簡單,就是取對應長度然後對比,符合就進行下一項,不符合直接返回false,完整程式碼如下
package com.xxx.itt.coverage.utils;
import java.util.List;
import java.util.Objects;
import java.util.Stack;
public class Test {
private static Stack<Integer> list = new Stack<Integer>();
public static List<Integer> splitIntoFibonacci(String s) {
if(Objects.isNull(s) || s.length() <3) {
return null;
}
for(int i = 0 ; i < s.length()-2 ; i++) {
Integer first = Integer.parseInt(s.substring(0 , i+1));
list.clear();
list.add(first);
for(int j = i ; j < s.length() - 2 ; j++) {
Integer second = Integer.parseInt(s.substring(i+1 , j+2)) ;
list.add(second);
boolean flag = checkNum(first, second, j+2, s);
if(flag && list.size() > 2) {
System.out.println(list);
}
list.clear();
list.add(first);
}
}
return null ;
}
private static boolean checkNum(Integer first , Integer second , int index , String s) {
if(first == null
|| second == null
||index > s.length()) {
return false;
}
if(index==s.length()) {
return true;
}
String other = String.valueOf(first+second) ;
if(index+other.length() > s.length()) {
return false;
}
if(other.equals(s.substring(index, index+other.length()))) {
list.add(first+second);
return checkNum(second, first+second, index+other.length(), s);
}
return false ;
}
public static void main(String[] args) {
splitIntoFibonacci("1101111");
}
}
輸出如下:
[11, 0, 11, 11]
[110, 1, 111]
相關文章
- 《每日一題》842. Split Array into Fibonacci Sequence 將陣列拆分成斐波那契序列每日一題陣列
- 斐波那契數
- 斐波那契數列演算法演算法
- 斐波那契數列
- 演算法(1)斐波那契數列演算法
- 第十題:斐波那契數列
- 前端菜鳥的每週一道演算法題(二) 斐波那契數列前端演算法
- Leedcode-斐波那契數
- 509. 斐波那契數
- 斐波那契數列(Java)Java
- LeetCode 509[斐波那契數]LeetCode
- 一千位斐波那契數
- 大數斐波那契數列的演算法演算法
- 演算法一:斐波那契阿數列演算法
- №20181213賽事:斐波那契數賽題
- 【LeetCode刷題】509. 斐波那契數LeetCode
- 【演算法】Fibonacci(斐波那契數列)相關問題演算法
- 演算法 - 斐波那契 - javascript 版演算法JavaScript
- 斐波那契數列 (C#)C#
- PHP 與斐波那契數列PHP
- LeetCode-509-斐波那契數LeetCode
- 斐波那契數列詳解
- 著名的斐波那契數列
- 計算斐波那契數列的演算法演算法
- LeetCode每日一題:斐波那契數(No.509)LeetCode每日一題
- js實現斐波那契數列JS
- LeetCode LCR126[斐波那契數]LeetCode
- [C103] 斐波那契數列
- 力扣之斐波那契數列力扣
- 劍指offer——斐波那契數列
- 斐波那契數列js 實現JS
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- 斐波那契數列的來源——數兔子
- 斐波那契數列數與等冪和
- 每日一算 -- 斐波那契數列型別題型別
- 如何將斐波那契數列應用到排版設計中
- 使用Python實現斐波那契數列Python
- LeetCode 1137第N個斐波那契數LeetCode