一维数组最大子数组续

要求:

1  按 单步执行 键, 在 GUI 看到你的程序是如何一步一步算出目前最大子数组的范围,当前计算到的临时子数组是在哪里,等等。 最好用不同的颜色标识不同的状态。
2  按 自动运行 键, 在 GUI 看到程序自动运行,并自动显示过程, 每次改变状态的时候要稍作停留 (例如 1 秒钟的时间)
3  最好有一个 倒带 / 回滚 的键, 让用户可以看清楚关键的几步。

代码:

package test0425;

import java.util.Scanner;

public class shuzukeshihua {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in); 
        //定义数组长度和数组
        //输入数组长度
        System.out.println("请输入数组的长度:");
        int size=sc.nextInt();
        int a[]=new int[size];
        int sum=0;
        int curr=0;
        
        
        //输入数组的内容
        System.out.println("请输入数组内容:");
        for(int i=0;i<size;i++) {
            a[i]=sc.nextInt();
        }
        
        System.out.println("输入1单步执行,否则连续执行");
        int q=0;
        q=sc.nextInt();
        if(q==1) {
        	 //有负有正
            for(int i=0;i<size;i++) {
            	System.out.println("第"+(i+1)+"步");
                curr=curr+a[i];
                System.out.println("第"+(i+1)+"个子数组的总和:"+curr);
                if(curr<0) {
                    curr=0;
                }else {
                    if(sum<curr) {
                        sum=curr;
                    }
                }
                System.out.println("第"+(i+1)+"个子数组下,当前的最大子数组之和"+sum);
                System.out.println("当前已检查了前"+(i+1)+"个元素");
                System.out.println(" ");
                System.out.println("输入1为继续,0为退出");
                int g=0;
                g=sc.nextInt();
                if(g==0) {
                	break;
                }
                else if(g==1){
                	System.out.println("继续执行!");
                }
            }
            //若全是是负数
            if(sum==0) {
            	System.out.println("全为负数");
                int sum1=a[0];
                for(int i=0;i<size-1;i++) {
                    if(sum1>a[i+1]) {
                        sum1=sum1;
                    }
                    else {
                        sum1=a[i+1];
                    }
                    
                    System.out.println("第"+(i+1)+"步");
                    System.out.println("当前的最大值:"+sum1);
                    System.out.println(" ");
                }
                sum=sum1;
                
            }
            
            System.out.println("连续子数组的最大值为:"+sum);
        }
        else//连续 
        {
        	//有负有正
            for(int i=0;i<size;i++) {
            	System.out.println("第"+(i+1)+"步");
                curr=curr+a[i];
                System.out.println("第"+(i+1)+"个子数组的总和:"+curr);
                if(curr<0) {
                    curr=0;
                }else {
                    if(sum<curr) {
                        sum=curr;
                    }
                }
                System.out.println("第"+(i+1)+"个子数组下,当前的最大子数组之和"+sum);
                System.out.println("当前已检查了前"+(i+1)+"个元素");
                System.out.println(" ");
            }
            
        		//若全是是负数
                if(sum==0) {
                    int sum1=a[0];
                    for(int i=0;i<size-1;i++) {
                        if(sum1>a[i+1]) {
                            sum1=sum1;
                        }
                        else {
                            sum1=a[i+1];
                        }
                        System.out.println("第"+(i+1)+"步");
                        System.out.println("当前的最大值:"+sum1);
                        System.out.println(" ");
                    }
                    sum=sum1;
                }
            
            System.out.println("连续子数组的最大值为:"+sum);
            
            int huigun=0;            
            System.out.println("输入回滚步骤:");
            huigun=sc.nextInt();
            if(huigun>=1&&huigun<=size)
            {//输入的回滚步骤属于正常范围
            	if(sum<=0) {//全为负数的回滚
                    int sum1=a[0];
                    for(int i=0;i<size-1;i++) {
                        if(sum1>a[i+1]) {
                            sum1=sum1;
                        }
                        else {
                            sum1=a[i+1];
                        }
                        if(i+1==huigun) {
                        	System.out.println("第"+(i+1)+"步");
                            System.out.println("当前的最大值:"+sum1);
                            System.out.println(" ");
                        }
                        
                    }
                    sum=sum1;
                }
            	else {//有负有正的回滚
            		curr=0;
            		for(int i=0;i<huigun;i++) {
                        curr=curr+a[i];
                        if(i+1==huigun) 
                        {
                        	 System.out.println("第"+(i+1)+"步");
                        	 System.out.println("第"+(i+1)+"个子数组的总和:"+curr);
                        }
                        if(curr<0) {
                            curr=0;
                        }else {
                            if(sum<curr) {
                                sum=curr;
                            }
                        }
                        if(i+1==huigun) 
                        {
                        	System.out.println("第"+(i+1)+"个子数组下,当前的最大子数组之和"+sum);
                            System.out.println("当前已检查了前"+(i+1)+"个元素");
                            System.out.println(" ");
                        }
                        
                    }
            	}
            	
            }
        }
        
	}

}

 运行截图:

可以选择单步或者连续执行

单步过程:输入1继续,0退出

连续过程:

在连续过程下可以输入回滚:手动输入回滚到第几步

原文地址:https://www.cnblogs.com/xcl666/p/10770824.html