每天一道演算法題(將數拆分成斐波那契序列)

dw147258dw發表於2020-12-09

這道題其實並不難,斐波那契序列裡面起作用的也就是前兩個數,第一個和第二個數確定了,那麼整個數列就確定了,那麼後面我們只需要驗證就可以了,

思路:我們可以迴圈取前兩個數,然後驗證後面的數是否符合要求,如果符合則輸出,不符合進行下一次驗證

那麼我們可以用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]
 

相關文章