合作过程:
由于上次作业设计思想不同,经过讨论采用了统一的设计思想。对于这次的作业我们一起进行讨论,我们统一利用二维数组完成一维数组的循环求子数组。我负责进行编码,丽萍负责进行代码的审查和代码的测试。
设计思想:
基于上次不循环一维数组求子数组的最大值。
1.将一维数组转化为二维数组,变相将其转化为循环。即二维数组每一行使一维数组依次向前移动一个数。
2.利用上次思想一次求出每行子数组的最大值。
2.1.定义两个数s,max用来更新子数组的最大值,从数组data[]的data[n-1]开始进行求和比较。
2.2利用for循环,依次判断前几项之和是否小于0,若小于0则从该项继续寻找最大值,并与前几项的最大值进行比较。选出最大值。
3.比较二维数组每行子数组的最大值的大小,并作比较,将最大值输出。
遇到的问题:
一维数组转化为二维数组出现数组越界。
源代码:
import java.util.Scanner; public class Test{static int[][] transform(int data[],int n){//将以为数组转化为二维数组,用来将一维数组变为循环数组int d[][]=new int[n][n];int j;for(j=0;j<n;j++)//第一行保存一维数组 {d[0][j]=data[j];}for(int i=1;i<n;i++)//一次前进一个数储存在二维数组下一行 { for(j=0;j<n-1;j++){int t=d[i-1][0];d[i][j]=d[i-1][j+1];d[i][n-1]=t;} }return d;}static int sum(int data[], int n)//定义数组和数组长度 {int s = data[n-1];//s用来更新子数组最大值int max = data[n-1];//a表示最大值for(int i=n-2;i>=0;i--)//逆序进行 {if(s<0)//前几项的和为负数,重新计算 {s=0;}s=s+data[i];if(s>max){max=s;//将最大值赋值给a }} return max;} public static void main(String[] args) {// TODO Auto-generated method stubScanner in=new Scanner(System.in);System.out.println("请输入数组长度:");int n=in.nextInt();int array[]=new int[n];int twoArray[][]=new int[n][n];System.out.println("请输入"+n+"个整数:");for(int i=0;i<n;i++){array[i]=in.nextInt();}//转化为二位数组twoArray=transform(array,n);int result[]=new int[n];int chucun[]=new int[n];for(int i=0;i<n;i++){for(int j=0;j<n;j++){//将二维数组每一行储存在一维数组中chucun[j]=twoArray[i][j]; }//计算每行的子数组最大值result[i]=sum(chucun,n);}//找到result中的最大值int max=result[0];for(int i=0;i<n-1;i++){if(result[i+1]>result[i]){max=result[i+1];} }System.out.print("子数组的最大值为:"+max);}}
实验结果截图:
总结:
在第一次程序的基础上,只要实现一位数组循环即可。可用二维数组实现一维数组循环。