一维数组最大子数组续
要求:
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退出
连续过程:
在连续过程下可以输入回滚:手动输入回滚到第几步