• 课堂练习--最大子数组和 环


    一、设计思路

    1、circle(int l)函数进行数组长度的输入。

    2、setArray()函数进行数组的输入。

    3、changeArray()函数将数组环转化为数组列 此时求出的max为环的最大值

        首先,将array[]数组的值赋值给sArray[]数组,进行原值储存。然后for循环找出此数组的最小值。 

         然后在通过循环得到此最小值的位置。然后在将位置后的数赋值给新数组nArray数组前面,位置前的        赋值给nArray后面,得到一个最小值在首位置的新数组。

    4、

    ArrayMax()函数实现求最大子数组的和。应为复杂度为O(n),首先 输入一个数组 如:

     -1 2 -1 -2 5 4 3 -6 8 9 

    先定义一个新的数组cArray[],长度为11.然后初始化cArray[1]为0;for循环中 有

    cArray[i+1] = cArray[i]+array[i];

    所以新的数组为 :

    0 -1 2 1 -1...

    因为求最大值,所以判断当cArray[]小于0时,将5 赋值给新数组

    即为:

    0 -1 2 1 -1 5 9 12 6...

    最后在得到的新数组中求出最大的值 此时这个值为最大的子数组和。

     源代码:

      1 import java.util.Scanner;
      2 public class Array2 {
      3 
      4     public static void main(String[] args) {
      5         // TODO Auto-generated method stub
      6         System.out.println("Please input your array length");
      7         Scanner c = new Scanner(System.in);
      8         int cLength = c.nextInt();
      9         circle s = new circle(cLength);
     10         s.setArray();
     11         s.changeArray();
     12         s.arrayMax();
     13     }
     14 
     15 }
     16 class circle
     17 {
     18     int array[];//原数组
     19     int sArray[];//储存原始数组
     20     int nArray[];//转换后的新数组
     21     int cArray[];//最后得到的数组
     22     int length;//数组长度
     23     int max;
     24     int min;
     25     int position;
     26     int i;
     27     int m;
     28     public circle(int l)//输入数组长度
     29     {
     30         length = l;
     31     }
     32     
     33     void setArray()//输入数组
     34     {
     35         System.out.println("Please input your array  ");
     36         array = new int [length];
     37         Scanner s = new Scanner(System.in);
     38         for(int i=0;i<length;i++)
     39         {
     40             array[i]=s.nextInt();
     41         }
     42     }
     43 
     44     void changeArray()//将数组环转换为数组列 此时求出的max为最大值    
     45     {
     46         //储存原数组
     47         sArray = new int [length];        
     48         for(i= 0;i<length;i++)
     49         {
     50             sArray[i] = array[i];
     51         }
     52 
     53         //得到array数组中的最小值i
     54         for(i=length-2;i>=0;i--)
     55         {
     56             if(array[i]<array[i+1])
     57             {
     58                 min = array[i];
     59             }
     60             else if(array[i]>=array[i+1])
     61             {
     62                 m = array[i];
     63                 array[i] = array[i+1];
     64                 array[i+1] = m;
     65                 min = array[i];
     66             }
     67         }
     68         
     69         //找到最小值位置
     70         for(i=0;i<length;i++)
     71         {
     72             if(sArray[i]==min)
     73             {
     74                 position = i;
     75             }
     76         }
     77 
     78         //得到新的数组
     79         nArray = new int [length];
     80         for(i=0;i<length-position;i++)
     81         {
     82             nArray[i] = sArray[position+i];
     83         }
     84         for(i=length-position;i<length;i++)
     85         {
     86             if(length-position-i>0)
     87             {
     88                 nArray[i]=sArray[length-position-i];
     89             }
     90             else if(length-position-i<=0)
     91             {
     92                 nArray[i]=sArray[i+position-length];
     93             }
     94         }
     95 
     96     }
     97     void arrayMax()//输出最大值
     98     {
     99         cArray = new int [length+1];
    100         cArray[0] = 0;
    101         for(i=0;i<length;i++)
    102         {
    103             if(cArray[i]>=0)
    104             {
    105                 cArray[i+1] = cArray[i]+nArray[i];
    106             }                                
    107             while(cArray[i+1]<0)
    108             {
    109                 cArray[i+2]=nArray[i+1];
    110                 i++;
    111             }
    112         }
    113         //在数组中得到最大值
    114         for(i=1;i<length;i++)
    115         {
    116             if(cArray[i+1]>=cArray[i])
    117             {
    118                 max = cArray[i+1];
    119             }
    120             else if(cArray[i+1]<cArray[i])
    121             {
    122                 m = cArray[i];
    123                 cArray[i]=cArray[i+1];
    124                 cArray[i+1]=m;
    125                 max = cArray[i+1];
    126             }
    127         }
    128         System.out.println("max is "+max);
    129     }
    130 }

    三、截图

    四、总结

    单元测试很重要,能够发现一些函数功能的bug。  

    五、 结对开发过程体会以及解决冲突

    体会:

    在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。

    对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感,同时,能够降低学习成本,一边编程,一边共享知识和经验,有效地在实践中进行学习。

    在心理上,  当有另一个人在你身边和你紧密配合, 做同样一件事情的时候,  你不好意思开小差, 也不好意思糊弄。

    冲突:

    对于有不同习惯的编程人员,可以在一起工作会产生麻烦,甚至矛盾。

    两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。

    工作图:

                                                       

  • 相关阅读:
    直播报名| Kylin on Parquet 介绍及快速上手
    直播 | Apache Kylin & Apache Hudi Meetup
    1. MySQL体系结构和存储引擎——MySQL体系结构、存储引擎、连接MySQL
    深入理解Java虚拟机(第三版)-13.Java内存模型与线程
    Redis 字典实现
    JVM 判断对象已死亡?
    堆内存常见的分配策略、 经典的垃圾收集器、CMS与G1收集器及二者的比较
    String.intern() 和常量池
    Java 对象的创建过程(五步)、对象的内存布局、对象的访问定位
    Java内存区域(运行时数据区域)详解、JDK1.8与JDK1.7的区别
  • 原文地址:https://www.cnblogs.com/hzxsg0919/p/5384988.html
Copyright © 2020-2023  润新知