返回一个一维整数数组中最大子数组的和(环)
题目:
返回一个一维整数数组中最大子数组的和。 要求: 输入一个一维整形数组,数组里有正数也有负数。 一维数组首尾相接,象个一条首尾相接带子一样。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。
设计思想:
(1)存在三个一维数组。第一个用于存储 输入的数组;第二个用于存储不同子数组的最大值;第三个用于存储 起始点不同的数组的最大值。
(2)1、定制输入整数的个数
2、创建第一个一维数组,将数字输入
3、 利用循环,将所存在的第一个数组的数,进行加法计算,如果和为正数,继续计算;若和为负数,则下一个重新开始计算。所有计算结果放在第二个一维数组中,将第二个数组中,求最大值,放入第三个数组。
4、在第一个数组中,不同的位置为 计算开始,重复进行 3 。
5、求出第三个数组的最大值。输出
源代码:
import java.util.Scanner; public class CircleShuzu { public static void main(String args[]) { Scanner shu=new Scanner(System.in); System.out.println("请输入整数的个数:"); int count=shu.nextInt(); while(count<=0) { System.out.println("输入错误,请重新输入:"); count=shu.nextInt(); } int Array[]=new int[count]; int Crray[]=new int[count]; System.out.println("请输入整数"); for(int i=0;i<count;i++) { Array[i]=shu.nextInt(); } for(int j=0;j<count;j++) { int b=1; int Brray[]=new int[100]; Brray[0]=Array[j]; if(j==count-1) { for(int i=0;i<count-1;i++) { if(Brray[b-1]<=0) { Brray[b]=Array[i]; } if(Brray[b-1]>0) { Brray[b]=Brray[b-1]+Array[i]; } if(i==j-1) { break; } b++; } } for(int i=j+1;i<count;i++) { if(Brray[b-1]<=0) { Brray[b]=Array[i]; } if(Brray[b-1]>0) { Brray[b]=Brray[b-1]+Array[i]; } if(i==count-1) { i=-1; } if(i==j-1) { break; } b++; } int Max1=Brray[0]; for(int i=1;i<count;i++) { if(Brray[i]>Max1) { Max1=Brray[i]; } } Crray[j]=Max1; } int Max2=Crray[0]; for(int m=1;m<count;m++) { if(Crray[m]>Max2) { Max2=Crray[m]; } } System.out.println("数组最大值为:"+Max2); } }
结果截图:
合作过程体会:
通过讨论,我们在之前的题进行了改进,之前的题我们用的是二维数组,这次我们用多个一维数组来解决问题,进一步从不同首项遍历,选取最大值就行了。
两人一起分析程序,李杨编写代码,我复审,遇到错误,共同解决。
冲突解决:
当首项为最后一个数时,跳过了之前设计的循环,从而导致错误。所以给最后的首相列出了单独的计算。
总结:
两次设计思想差不多。有所改变的是将二维数组改为一维数组,多个数组来储存所需要的值。合作开发能高效率地解决一些问题,方向能够更准确。