合作过程:
由于上次作业设计思想不同,经过讨论采用了统一的设计思想。对于这次的作业我们一起进行讨论,我们统一利用二维数组完成一维数组的循环求子数组。我负责进行编码,丽萍负责进行代码的审查和代码的测试。
设计思想:
基于上次不循环一维数组求子数组的最大值。
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 stub Scanner 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); } }
实验结果截图:
总结:
在第一次程序的基础上,只要实现一位数组循环即可。可用二维数组实现一维数组循环。
时间: 2024-10-26 08:29:13