题目:
输入一个一维整形数组,数组里有正数也有负数。
一维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。
设计思想:
1.设计思想:
首先设置两个变量,分别用来存储数组长度也就是number和结果result;然后再通过语句来询问用户需要的数组长度再设个动态数组用来让用户输入数组中的数字,将每一个数值都存放进数组对应位置,再设一个number长度的数组max[number]来存放每一次循环得到的最大值;再使用两个循环嵌套,第一个循环是选择开始位置,从i=0开始,直到i=number,每一次都让对应的max[i]初始为a[i],result=0,之后是里面的第二个循环,从j=i开始,执行number次,每次都让result=result+a[i],之后判断以下条件:若result>max[i],则让max[i]=result;若result<0,则让result=0;若j==number-1,则需令j=-1;>若j==i-1,则结束此次循环。令result=max[0],使用循环来判断max数组中的最大值,即为最大子数组的和;最后返回结果result。
2,源代码:
1 //马建宁写于2017.3.31课堂作业 2 package 课堂测试; 3 import java.util.*; 4 public class cs2 5 { 6 public static void main(String args[]) 7 { 8 int number = 0,result = 0; 9 @SuppressWarnings("resource") 10 Scanner in= new Scanner(System.in); 11 System.out.print("请输入需要的数组长度:"); 12 number = in.nextInt(); 13 14 int a[] = new int [number]; 15 int max[] = new int [number]; 16 System.out.print("请输入一个长度为"+number+"的数组(输入范围:自然数):"); 17 for(int i = 0;i<number;i++) 18 { 19 a[i] = in.nextInt(); 20 } 21 22 for(int i = 0;i < number;i++) 23 { 24 max[i] = a[i]; 25 result = 0; 26 for(int j = i;j < number;j++) 27 { 28 result=result+a[j]; 29 30 if(result > max[i]) 31 { 32 max[i] = result; 33 } 34 if(result < 0) 35 { 36 result = 0; 37 } 38 39 if(j == number-1) 40 { 41 j = -1; 42 } 43 if(j == i-1) 44 { 45 break; 46 } 47 } 48 } 49 result = max[0]; 50 for(int i = 1;i<number;i++) 51 { 52 if(max[i] > result) 53 { 54 result = max[i]; 55 } 56 } 57 58 System.out.println("最大子数组和为:"+result); 59 } 60 }
3.运行结果