一维数组最大子数组续(单步执行,回滚)

一:程序代码

package shuzu;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class xuexi {
	
	public static void main(String[] args) {
		int number;
		System.out.println("请输入数组的长度");
		Scanner sc=new Scanner(System.in);
		number=sc.nextInt();
		int array[]=new int[number];
		System.out.println("请输入数组的值");
		for(int i=0;i<number;i++) {
			array[i]=sc.nextInt();
		}//输入数组的值
		int maxsum,maxstart;	
		
		maxsum=array[0];
		maxstart=array[0];
		int pointstart=1,pointend=1;
		List<Integer> type1=new ArrayList<Integer>();
		List<Integer> type2=new ArrayList<Integer>();
		List<Integer> type3=new ArrayList<Integer>();
		List<Integer> type4=new ArrayList<Integer>();
		List<Integer> type5=new ArrayList<Integer>();
		
		for(int i=1;i<number;i++)
        {
			type1.add(maxstart);
            type2.add(maxsum);
            type3.add(pointstart);
            type4.add(pointend);
            type5.add(i);
            if(maxstart<0)
            {
               maxstart=0;
               pointstart=i+1;
            }
            maxstart+=array[i];//两两组合求和
            if(maxstart>maxsum)
            {
            	maxsum=maxstart;
            	pointend=i+1;
            }
            
            
            	
            	System.out.println("第"+i+"步子数组的和的数值"+maxsum +" 位置是"+pointstart+"到"+pointend +" 检查的子集的个数是:"+i+" 总共有"+number+"个数据");
            	System.out.println("请输入你要回滚的层数,输入非数字的字符进入下一步");
            	int back=0;
            	if(sc.hasNextInt())
            	{
            		back=sc.nextInt();
            		maxstart=type1.get(back-1);
            		maxsum=type2.get(back-1);
            		pointstart=type3.get(back-1);
            		pointend=type4.get(back-1);
            		i=type5.get(back-1)-1;
            	}
            	else sc.next();
            	
              
        }
        
        System.out.println("子数组的最大和为:");
        System.out.println(maxsum);
       
    }

}

  程序实验结果截图:

 

设计思想:首先定义存储数据类型的变量,利用arraylist数组存储记录子数组最大值,以及子数组的开始数据位置和结束数据位置,还要存储子数组的个数

定义back变量通过输入整形数字确定回滚的步揍,

             maxstart=type1.get(back-1);
              maxsum=type2.get(back-1);
              pointstart=type3.get(back-1);
              pointend=type4.get(back-1);
              i=type5.get(back-1)-1;

这些通过调用arraylist数组,把回滚后的数据复制到当前数值中

通过输入非整形字符可以单步执行程序到程序截止。

转载于:https://www.cnblogs.com/1502762920-com/p/10770619.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值