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