一、设计思路
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。
时间: 2024-10-18 18:31:18