题目:
输入一个一维整形数组,数组里有正数也有负数。 一维数组首尾相接,象个一条首尾相接带子一样。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。
程序设计思想:求循环数组的子数组和的最大值,求子数组循环到数组第一个元素,另外定义一个素组长度为原来数组的两倍,定义和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);
}
}