课堂练习——返回一个一维整数数组中最大子数组的和

题目要求: 返回一个一维整数数组中最大子数组的和。

具体要求:输入一个一维整形数组,数组里有正数也有负数;

       一维数组首尾相接,象个一条首尾相接带子一样;

     数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;

     求所有子数组的和的最大值。

1.设计思想:

  ①设置两个变量,分别用来存储数组长度(number)和结果(result);

  ②通过语句来询问用户需要的数组长度,之后设定一个动态数组,之后用循环语句让用户输入数组中的每一个值,将每一个数值都存放进数组对应位置,同时设定一个number长度的数组max[number],用来存放每一次循环得到的最大值;

  ③使用两个循环嵌套,第一个循环是选择开始位置,从i=0开始,直到i=number,每一次都让对应的max[i]初始为a[i],result=0,之后是里面的第二个循环,从j=i开始,执行number次,每次都让result=result+a[i],之后判断以下条件:

    1>若result>max[i],则让max[i]=result;

    2>若result<0,则让result=0;

    3>若j==number-1,则需令j=-1(☆☆使得此数组首尾相连的关键步骤☆☆);

    4>若j==i-1,则结束此次循环。

  ④令result=max[0],使用循环来判断max数组中的最大值,即为最大子数组的和;

  ⑤输出结果result。

2.源代码:

 1 import java.util.*;
 2 
 3 public class RingMaxResult 
 4 {
 5     public static void main(String args[])
 6     {
 7         int number = 0,result = 0;
 8         @SuppressWarnings("resource")
 9         Scanner in= new Scanner(System.in);
10         System.out.print("请输入需要的数组长度:");
11         number = in.nextInt();
12         
13         int a[] = new int [number];
14         int max[] = new int [number];
15         System.out.print("请输入一个长度为"+number+"的数组(输入范围:自然数):");
16         for(int i = 0;i<number;i++)
17         {
18             a[i] = in.nextInt();
19         }
20         
21         for(int i = 0;i < number;i++)
22         {
23             max[i] = a[i];
24             result = 0;
25             for(int j = i;j < number;j++)
26             {
27                 result=result+a[j];
28                 
29                 if(result > max[i])
30                 {
31                     max[i] = result;
32                 }
33                 if(result < 0)
34                 {
35                     result = 0;
36                 }
37                 
38                 if(j == number-1)
39                 {
40                     j = -1;
41                 }
42                 if(j == i-1)
43                 {
44                     break;
45                 }
46             }
47         }
48         
49         result = max[0];
50         
51         for(int i = 1;i<number;i++)
52         {
53             if(max[i] > result)
54             {
55                 result = max[i]; 
56             }
57         }
58         
59         System.out.println("此数组首尾相接后,其中最大子数组的和为:"+result);
60     }
61 }

3.结果截图:

4.总结:

  工作照:

    

   结对编程过程:
      在得到了题目后,我们在各自有了大体的想法之后,一起讨论了一下这个题目,将各自得出的想法进行分享,找出各自想法中的闪光点与不足,最后将结果总结,得出了初步构思,然后将想法投入到编程中去,在编程结束后进行单元测试,然后测试了多组数据均得到了正确的结果。
  结对编程体会:
      ①经这次结对编程,我体会到了团队协作的重要性,每个人都缺一不可,每个人都能起到不可或缺的的作用,将各自的优势发挥出来能让编程过程更加快捷并且有效率,我们以后要发扬这种优势。
      ②充分利用每一次循环,注意题目中的要求,要在每一次循环中都把相应需要判断的条目书写完整,注意判断循环结束和要求中的条件,做到符合道理、准确地完成题目。还要尽可能做到简洁,减少代码的冗杂,不设置多余的变量,不适用麻烦的算法,这样才可以最大限度的增加代码的效率。
  结对编程冲突的解决:
      不要太过固执,自己的想法不一定都正确,不一定完美,要学会善于听取别人的意见和建议,要学会站在别人的立场考虑问题;保持谦卑,以一颗学习的心去对待每一个人,他们或多或少都有值得我们学习的地方。
原文地址:https://www.cnblogs.com/Daddy/p/5378424.html