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


    一:程序代码

    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数组,把回滚后的数据复制到当前数值中

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

  • 相关阅读:
    VC++:创建,调用Win32静态链接库
    VC++:创建,调用Win32动态链接库
    C++生成和解析XML文件
    C++实现16进制字符串转换成int整形值
    一个好隐蔽的C/C++代码bug
    【C++札记】标准模板库string
    Rabbitmq C++客户端 Rabbitmq Client
    C++:标准模板库map
    C++:标准模板库vector
    C++:标准模板库(STL)
  • 原文地址:https://www.cnblogs.com/1502762920-com/p/10770619.html
Copyright © 2020-2023  润新知