一、实验要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。
结对编程要求:
两人结对完成编程任务。
一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)
二、实验思路:
- 联系思考如果不是循环数组的话,一个普通的数组,求他们的连续的最大子数组的和的最大值,应该怎么实现,例如:1,2,3,4,5 如果是一个循环数组,那么其中的3,可以组成的数组最大就不是3,4,5,而是3,4,5,1,2
- 循环数组从那个数开始,那么相当于在那个数的位置切开,他的最大子数组,就是和他相邻的但是断开后不相邻的那个位置,例如从4开始,和4相邻的是3和5,当截断后可以看成是一个普通数组4,5,1,2,3,其中的3就是和他相邻但是截断后不相邻的数
- 如果想求这个数组,我们可以把这个数组扩展一下,如1,2,3,4,5我们可以扩展成1,2,3,4,5,1,2,3,4 ,也就是在最后一个数的后面再加上他前面的数,然后我们在取最长的子数组的时候,可以按照第二个新构建的数组,从其中取连续的五个,这个是满足要求的数组
三、团队成员:曾凯 王志伟
四、开发照片:
五、实验代码:
package demo3; public class Route { public static void main(String[]args) { int a[]={1,2,3,4,5,6}; int b1[] = new int[2*a.length-1]; for(int i=0;i<a.length;i++) { b1[i]=a[i]; } for(int i=a.length;i<2*a.length-1;i++) { b1[i] = a[i-a.length]; } int b[]=panduan(a); System.out.print("最大子数组是:"); for(int i=b[1];i<=b[2];i++) { System.out.print(b1[i]+" "); } System.out.println("\n最大值是:"+b[0]); } static int[] panduan(int[] a) { int b[] = new int[2*a.length-1]; for(int i=0;i<a.length;i++) { b[i]=a[i]; } for(int i=a.length;i<2*a.length-1;i++) { b[i] = a[i-a.length]; } int [][]a1= new int[b.length][b.length]; for(int i=0;i<a.length;i++) { for(int j=i;j<b.length&j-i<a.length;j++) { a1[i][j]=0; } } for(int i=0;i<a.length;i++) { for(int j=i;j<b.length&j-i<a.length;j++) { if(j==i) { a1[i][j]=b[j]; } else { a1[i][j]+=b[j]+a1[i][j-1]; } } } int max=a1[0][0]; int i1=0; int j1=0; for(int i=0;i<a.length;i++) { for(int j=i;j<b.length&j-i<a.length;j++) { if(max<a1[i][j]) { max=a1[i][j]; i1=i; j1=j; } } } int a2[]=new int[3]; a2[0]=max; a2[1]=i1; a2[2]=j1; return a2; } }
六、结果截图:
七、实验总结:
通过这次两人团队的协助编程,其中我主要负责代码测试部分,代码编程部分由另一名组员完成,经过大概一个多小时的讨论和编码,最终完成。开始的时候,主要是讨论两个人对本题的思路,然后动笔在纸上写了一个数组,然后按照普通的数组,先想普通数组求这个最大子数组的和,应该如何实现,接着通过交流两个人的对算法的理解,最后实现了这个功能。
通过这次实验,我也增加了团队沟通和协助能力。