题目要求:
1、输入一个一维整形数组,数组里有正数也有负数。
2、一维数组首尾相接,象个一条首尾相接带子一样。
3、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。
设计思想:首先定义数组和它的长度,输入数组,再定义一个数组,此数组的值为两个第一个数组的信息(用for循环进行数组信息的录入),再定义三个int类型的flag(保存暂时的和)和sum(保存最大值)还有s(用于控制开始位置和子数组的最大长度,不能高于第一个数组的长度)。运用for循环进行对flag的更新,如果flag>sum则sum进行更新,反之不更新。例子:如第一个数组为1 2 3 ;则第二个数组为1 2 3 1 2 3 。flag依次为1,1 2,1 2 3,2,2 3,2 3 1,3,3 1,3 1 2...,最终结果为6,子数组为1 2 3。
出现的问题:(按例子)循环的时候总是跳过2开头的循环,后来知道if(s<Array.length)的时候是i=s-1,不是i=s,因为i=s之后i还会++。
源代码:
import java.util.Scanner; public class Sum2 { static void sum(int Array[]) { int i,s=0; int sum=0,flag=0; //[1,-2,-3,4,9] int Array2[]=new int[2*Array.length]; for(i=0;i<Array2.length;i++) { if(i!=Array.length) { Array2[i] = Array[i]; } if(i==Array.length) { for(int z=0;z<Array.length;z++) { Array2[z+Array.length] = Array[z]; i++; } } } //System.out.println("Array2:");s //for(i=0;i<Array2.length;i++) //System.out.println("Array2[i]);1 2 -3 5 -4 9 ///////////////////////////////////////////////////////////// for(i=s;i<Array.length+s;i++) { //System.out.println(i); flag=flag+Array2[i]; if(flag>sum) sum=flag; else sum=sum+0; if(i==Array.length-1+s) { s++; if(s<Array.length) { i=s-1; flag=0; } else break; } } System.out.println("环形数组最大子数组的和:"+sum); } public static void main(String[] args) { // TODO 自动生成的方法存根 int l,i; Scanner in = new Scanner(System.in); System.out.print("请输入数组长度:"); l=in.nextInt(); int Arr[]=new int[l]; System.out.print("请输入数组的值:"); for(i=0;i<Arr.length;i++) { Arr[i] = in.nextInt(); } sum(Arr); in.close(); } }
结果截图: