题目要求: 返回一个一维整数数组中最大子数组的和。
具体要求:输入一个一维整形数组,数组里有正数也有负数;
一维数组首尾相接,象个一条首尾相接带子一样;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值。
1.设计思想:
①设置两个变量,分别用来存储数组长度(number)和结果(result);
②通过语句来询问用户需要的数组长度,之后设定一个动态数组,之后用循环语句让用户输入数组中的每一个值,将每一个数值都存放进数组对应位置,同时设定一个number长度的数组max[number],用来存放每一次循环得到的最大值;
③使用两个循环嵌套,第一个循环是选择开始位置,从i=0开始,直到i=number,每一次都让对应的max[i]初始为a[i],result=0,之后是里面的第二个循环,从j=i开始,执行number次,每次都让result=result+a[i],之后判断以下条件:
1>若result>max[i],则让max[i]=result;
2>若result<0,则让result=0;
3>若j==number-1,则需令j=-1(☆☆使得此数组首尾相连的关键步骤☆☆);
4>若j==i-1,则结束此次循环。
④令result=max[0],使用循环来判断max数组中的最大值,即为最大子数组的和;
⑤输出结果result。
2.源代码:
1 import java.util.*; 2 3 public class RingMaxResult 4 { 5 public static void main(String args[]) 6 { 7 int number = 0,result = 0; 8 @SuppressWarnings("resource") 9 Scanner in= new Scanner(System.in); 10 System.out.print("请输入需要的数组长度:"); 11 number = in.nextInt(); 12 13 int a[] = new int [number]; 14 int max[] = new int [number]; 15 System.out.print("请输入一个长度为"+number+"的数组(输入范围:自然数):"); 16 for(int i = 0;i<number;i++) 17 { 18 a[i] = in.nextInt(); 19 } 20 21 for(int i = 0;i < number;i++) 22 { 23 max[i] = a[i]; 24 result = 0; 25 for(int j = i;j < number;j++) 26 { 27 result=result+a[j]; 28 29 if(result > max[i]) 30 { 31 max[i] = result; 32 } 33 if(result < 0) 34 { 35 result = 0; 36 } 37 38 if(j == number-1) 39 { 40 j = -1; 41 } 42 if(j == i-1) 43 { 44 break; 45 } 46 } 47 } 48 49 result = max[0]; 50 51 for(int i = 1;i<number;i++) 52 { 53 if(max[i] > result) 54 { 55 result = max[i]; 56 } 57 } 58 59 System.out.println("此数组首尾相接后,其中最大子数组的和为:"+result); 60 } 61 }
3.结果截图:
4.总结:
工作照:
在得到了题目后,我们在各自有了大体的想法之后,一起讨论了一下这个题目,将各自得出的想法进行分享,找出各自想法中的闪光点与不足,最后将结果总结,得出了初步构思,然后将想法投入到编程中去,在编程结束后进行单元测试,然后测试了多组数据均得到了正确的结果。
结对编程体会:
①经这次结对编程,我体会到了团队协作的重要性,每个人都缺一不可,每个人都能起到不可或缺的的作用,将各自的优势发挥出来能让编程过程更加快捷并且有效率,我们以后要发扬这种优势。
结对编程冲突的解决: