zoukankan      html  css  js  c++  java
  • 将数组拆分成斐波那契序列

    package Leetcode;
    
    import java.util.ArrayList;
    import java.util.List;
    /**
     * 给定一个数字字符串 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 拆分出来的任意一组斐波那契式的序列块,如果不能拆分则返回 []。
     */
    public class splitToFibonaci {
        public static void main(String[] args) {
            String s="5511816597";
            List<Integer> list=splitIntoFibonacci(s);
            int x=0;
        }
        public static List<Integer> splitIntoFibonacci(String S){
            List<Integer> res=new ArrayList<>();
            helper(S.toCharArray(), res, 0);
            return res;
    
        }
        public static boolean helper(char []s,List<Integer> res,int index){
            //终止条件,到末尾而且得到至少一组三个斐波那契数
            if(index==s.length&&res.size()>=3){
                return true;
            }
            
            for(int i=index;i<s.length;i++){
                // if(s[index]=='0'&&i<index){
                //     break;
                // }
                //0开头,至少两位
                if(s[index]=='0'&&i>index){
                    break;
                }
                //index开头到i的数转化成int
                long num=getNum(index, i+1, s);
                if(num>Integer.MAX_VALUE){
                    break;
                }
                //第三个数比前面两个和都大,不用截取更长的了,break
                if(res.size()>=2&&res.get(res.size()-1)+res.get(res.size()-2)<num){
                    break;
                }
                //只有一个或者组成一组斐波那契序列
                if(res.size()<=1||res.get(res.size()-1)+res.get(res.size()-2)==num){
                    res.add((int)num);
                    //到第三个数后面一个字母重新开始这个过程,到最后成功了返回
                    if(helper(s, res, i+1)){
                        return true;
                    }
                    //不成功不断弹出最近添加的数,回溯
                    res.remove(res.size()-1);
                }
                
    
    
            }
            return false;
    
        }
        public static long getNum(int begin,int end,char []c){
            long x=0;
            for(int i=begin;i<end;i++){
                x=x*10+c[i]-'0';
            }
            
            return x;
        }
    
        public static List<Integer> splitIntoFibonacci1(String S) {
            int flag=0;
            List<Integer> list=new ArrayList<>();
            for (int j=1;j<=S.length()/3;j++){
                for(int i=0;i+3*j<=S.length();i++){
                int x1=Integer.parseInt(S.substring(i,i+j));
                int x2=Integer.parseInt(S.substring(i+j,i+2*j));
                int x3=Integer.parseInt(S.substring(i+2*j,i+3*j));
                
                if(!list.contains(x1)){
                    list.add(x1);
                }
                if(!list.contains(x2)){
                    list.add(x2);
                }
                if(!list.contains(x3)){
                    list.add(x3);
                }
                if(x1+x2!=x3){
                    flag=1;
                    list.clear();
                    break;
                }
                }
                if(flag==0){
                    return list;
                }else{
                    flag=0;
                }
        }
            return new ArrayList<>();
        }
    }
  • 相关阅读:
    TortoiseSVN 实现文件的移动
    CSS选择器
    聚合报告90%参数说明
    JMeter响应断言详解
    测试结果分析
    Selenium+TestNG+Java报错:org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:40)
    在IntelliJ IDEA通过Maven添加依赖无效
    CentOS下安装TestLink
    Mysql存储过程生成指定格式的订单号
    Mysql使用函数生成指定随机字段内容
  • 原文地址:https://www.cnblogs.com/jieyi/p/14103474.html
Copyright © 2011-2022 走看看