题目:
输入一个一维整形数组,数组里有正数也有负数。 一维数组首尾相接,象个一条首尾相接带子一样。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。
程序设计思想:求循环数组的子数组和的最大值,求子数组循环到数组第一个元素,另外定义一个素组长度为原来数组的两倍,定义和m为0,依次加上数组元素,定义最大值max,判断max与m大小,m比max大的话,m的值赋给max。循环先从下标0开始,循环一个数组长度后,再从下标1开始,循环终止于开始位置的前一个元素,循环开始的位置依次增加,知道数组的最后一个位置截止。
出现的问题:一次循环截止的条件刚开始写的j=k 发现出现数组下标越界的情况,改成j=k-1发现多加了元素,最后想到改为 j=k-1+s。
源代码
package ER; import java.util.Scanner; public class Text { public static void main(String[] args) { // TODO Auto-generated method stub //数组长度 int k; System.out.println("请输入数组长度"); Scanner in=new Scanner(System.in); k=in.nextInt(); int a[]=new int[k]; //输入数组的元素 System.out.println("输入数组的元素"); for(int i=0;i<k;i++){ int n; n=in.nextInt(); a[i]=n; } int m = 0; int max = 0; int g=0; int l; l=2*k; //循环定义b数组长度为a的两倍 int b[]=new int[l]; for(int e=0;e<l;e++){ if(e!=k){ b[e]=a[e]; } if(e==k){ for(int r=0;r<k;r++){ b[r+k]=a[r]; e++; } } } //计算子数组和的最大值 int s=0; int j; for(j=0;j<k+s;j++){ m+=b[j]; if(m>max){ max=m; } if(j==k-1+s){ s++; if(s<k){ j=s-1; m=0; } else break; } } System.out.println("数组的最大子数组的和为:"+max); } }