这是求最大子数组的升级版,虽然算法并没有太大的变化,升级的要求是将每次循环的结果输出一遍,以及将对应的元素位置输出,以及判断了多少个数组。我运用数组块来进行计算的。同时使用输入数据来实现每次停顿,以及输入数字来选择回滚到那一次数据。在回滚操作有两种方法:
1、在运行一次计算函数,在该循环时输出相应的值。
2、将相应的循环结果存储在字符串数组中在回滚时,跳转到相应的地方,进行输出。
这里我选择第一种方法来给出代码:(这个代码的封装性较差,日后我会更改将封装性更好的提供出来)
//寻找循环数组中的最大子数组,长度已固定long=7; package hello; import java.util.Scanner; public class App8 { public static int time=1; public static void main(String[] args) throws InterruptedException { Scanner in= new Scanner(System.in); //writeFile(); int hang=7; long sum; String str; long[] num=new long[hang]; //储存数组块 long[] num2=new long [hang]; //循环减去第一个的数据,储存每行数据的值 long max=0; int n,s,start=1,end=1; boolean f=false; sum=in.nextLong(); num[0]=sum; if(sum>0)f=true; for( n=1,s=1;n<hang;n++) { //输入数组,并计算数组块 sum=in.nextLong(); if(num[s-1]*sum>0) num[s-1]+=sum; else { num[s]=sum; s++; } if(sum>0)f=true; } //if(num[0]*num[s]>0) {num[0]+=num[s];num[s]=0;} if(f==true) { max=num[0]; num2[0]=num[0]; for(int i=1;i<s;i++) { //计算以数组下标为0的各个子数组的和 num2[i]=num2[i-1]+num[i]; //if(num2[i]>num2[i-1])max=num2[i]; } for(int i=0,j=0;j<s;) { //循环输出最大子数组块以及相应的起始终止位置,和第几次循环 num2[i]=num2[i]-num[j]; if(num2[i]>max) {max=num2[i];start=j+2;end=i+1;} System.out.println("第 "+time+" 次循环, 已检查 "+time+" 种情况, 当前最大值为"+max+" 当前是第 "+start+" 个元素到第 "+end+" 个元素"); time++; if(i==s-1) {j++;i=j;} else i++; str=in.next(); if(str.equals("n"))continue; else {max=huigun(str,num,s);break;} //使用再次调用该数组进行回滚操作 } } else { //数组中全为负数的算法 max=num[0]; num2[0]=num[0]; for(int i=1;i<s;i++) { num2[i]=num2[i-1]+num[i]; if(num2[i]>max)max=num2[i]; System.out.println("第"+time+"次循环,还剩下"+time+"种情况,当前最大值为"+max); time++; } } System.out.println("最后结果最大值为"+max); in.close(); } private static long huigun(String str, long[] num, int s) throws InterruptedException { long[] num2=new long [s]; long max=0; int n=Integer.parseInt(str),start=1,end=1; max=num[0]; num2[0]=num[0]; int time2=1; time=n; for(int i=1;i<s;i++) { num2[i]=num2[i-1]+num[i]; //if(num2[i]>num2[i-1])max=num2[i]; } for(int i=0,j=0;j<s;) { num2[i]=num2[i]-num[j]; if(num2[i]>max) {max=num2[i];start=j+1;end=i+1;} if(time2>=n) { System.out.println("第 "+time+" 次循环, 已检查 "+time+" 种情况, 当前最大值为"+max+" 当前是第 "+start+" 个元素到第 "+end+" 个元素"); time++; } if(i==s-1) {j++;i=j;} else i++; time2++; //Thread.sleep(1000); } return max; } }
这次写代码给我个教训,这个教训老师在初次教我们写代码的时候就提醒过:那就是写注释。今天我在我原来的基础上改代码充分地体会到了,不写注释的坏处。需要将代码重新看一遍在进行更改。我记住这次教训了,日后在每次写完程序的时候,要抽出一定的时间将程序的设计思路,以及相应的数字总结下来。