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


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

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

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

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

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

    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.总结:

      工作照:

        

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