首先来看一下代码,
1 package classTestTwo; 2 3 import java.util.Scanner; 4 5 public class One { 6 7 @SuppressWarnings({ "resource", "unused" }) 8 public static void main(String[] args) { 9 Scanner sc=new Scanner(System.in); 10 //定义数组长度和数组 11 //输入数组长度 12 System.out.println("请输入数组的长度:"); 13 int size=sc.nextInt(); 14 int a[]=new int[size]; 15 int sum=0; 16 int curr=0; 17 18 19 //输入数组的内容 20 System.out.println("请输入数组内容:"); 21 for(int i=0;i<size;i++) { 22 a[i]=sc.nextInt(); 23 } 24 System.out.println("单步调试:"); 25 26 //有负有正 27 for(int i=0;i<size;i++) { 28 curr=curr+a[i]; 29 if(curr<0) { 30 curr=0; 31 }else { 32 if(sum<curr) { 33 sum=curr; 34 } 35 } 36 System.out.println("当前为第"+(i+1)+"步,"+"最大值为:"+sum); 37 System.out.println("当前检查了"+(i+1)+"个元素。"); 38 System.out.println("一共检查了"+(i+1)+"组。"); 39 System.out.println("按任意键以继续。"); 40 int check=0; 41 check=sc.nextInt(); 42 43 } 44 System.out.println("单步调试结束!最大值为:"+sum); 45 //回滚 46 System.out.println("回滚调试,回滚位置:"); 47 int num=sc.nextInt(); 48 int curr2=0; 49 for(int i=num-1;i<size;i++) { 50 for(int j=0;j<i;j++) 51 { 52 curr2=curr2+a[i]; 53 if(curr2<0) { 54 curr2=0; 55 }else { 56 if(sum<curr2) { 57 sum=curr2; 58 } 59 } 60 } 61 System.out.println("当前为第"+(i+1)+"步,"+"最大值为:"+sum); 62 System.out.println("当前检查了"+(i+1)+"个元素。"); 63 System.out.println("一共检查了"+(i+1)+"组。"); 64 System.out.println("按任意键以继续。"); 65 // int check=0; 66 // check=sc.nextInt(); 67 } 68 //若全是是负数 69 if(sum==0) { 70 int sum1=a[0]; 71 for(int i=0;i<size-1;i++) { 72 if(sum1>a[i+1]) { 73 //sum1不变 74 } 75 else { 76 sum1=a[i+1]; 77 } 78 } 79 sum=sum1; 80 System.out.println("当前最大"+sum); 81 } 82 83 84 } 85 86 }
这个代码是比较精简的,因为他的复杂度是O(n),这是在网上找到的比较经典的例子,也是比较容易看懂的。
再来说一下我的单步调试的思路,这个主要是在每一个for循环加上一个中止的因素,这个我添加的就是一个输入任意键,比较容易实行,主要是因为理解起来有一定的难度,所以开始不知道在干嘛。
然后是回滚调试,在理解了单步调试后,加上老师一遍又一遍的解释,不厌其烦地解释,费死劲的解释下,知道回滚是干嘛的了,然后写起来就很简单了,在单步调试后,再加入一个输入回滚位置的语句,得到回滚位置,再从回滚位置重来一遍(不包含单步调试),当然还要清空sum的值,或者再找一个替换他的位置。
这就ok了。