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

一、设计思路

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。  

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

体会:

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

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

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

冲突:

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

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

工作图:

                                                   

原文地址:https://www.cnblogs.com/hzxsg0919/p/5384988.html