你的位置:首页 > Java教程

[Java教程]课堂练习(返回一个整数数组中最大子数组的和)


1.设计思想

  只用一个主函数即可完成。

  首先,定义一个整型数组,让用户输入一组整数。

  然后,判断这一组数的正负还有零的情况。

  最后,根据判断出来的情况进行选择执行 if 语句,情况分别为全为0,负数和0,正数和0还有正数负数和0。

2.源代码

 1 /* 2  * For the maximum of the subarray of an integer array 3  * The start time 2016/4/8 16:50 4  * The end of time 2016/4/8 18:30 5  * Author Jing 6 */ 7 package arraymax; 8 import java.util.*; 9 public class SumArray { 10  11   public static void main(String[] args) { 12      13     Scanner sca=new Scanner(System.in); 14     System.out.println("输入整数数组数的个数"); 15     int num=sca.nextInt(); 16      17     int a[]=new int[num],b[]=new int[num]; 18     int i; 19     System.out.println("输入此组整数数组"); 20     for(i=0;i<num;i++) 21     { 22       a[i]=sca.nextInt(); 23     } 24     int l=0,j=0,k=0,sum=0,max; 25     for(i=0;i<num;i++)//判断输入数组的正负情况 26     { 27       if(a[i]>=0) 28       { 29         j++; 30       } 31       if(a[i]<0) 32       { 33         k++; 34       } 35       if(a[i]==0) 36       { 37         l++; 38       } 39     } 40     if(k==num)//全为负数 41     { 42       max=a[0]; 43       for(i=1;i<num;i++) 44       { 45         if(max<a[i]) 46         { 47           max=a[i]; 48         } 49       } 50       System.out.println("最大子数组和为 "+max); 51     } 52     else if((l+k)==num)//只有负数和0 53     { 54       System.out.println("最大子数组和为 0"); 55     } 56     else if(j==num)//全为非负数 57     { 58       for(i=0;i<num;i++) 59       { 60         sum+=a[i]; 61       } 62       System.out.println("最大子数组和为 "+sum); 63     } 64     else 65     { 66       for(i=0;i<num-1;i++) 67       { 68         if(a[i]>=0&&a[i+1]>=0) 69         { 70           a[i+1]=a[i]+a[i+1]; 71           a[i]=0; 72         } 73         if(a[i]<0&&a[i+1]<0) 74         { 75           a[i+1]=a[i]+a[i+1]; 76           a[i]=0; 77         } 78       } 79       k=0; 80       j=0; 81       while(k<num)//循环完成后b[]中只有正负数 82       { 83         if(a[k]!=0) 84         { 85           b[j]=a[k]; 86           j++; 87         } 88         k++; 89       } 90       if(b[0]<0) //寻找第一个正数的下标 91       { 92         i=1; 93       } 94       else 95       { 96         i=0; 97       } 98       while(i<j-2)//只有正数和负数时进行计算 99       {100         if(b[i]>(-b[i+1]) && (-b[i+1])<b[i+2])101         {102           b[i+2]=b[i]+b[i+1]+b[i+2];103           b[i]=0;104           b[i+1]=0;105           i=i+2;106         }107         else108         {109           i=i+2;110         }111       }112       max=b[0];113       for(i=1;i<j;i++)114       {115         if(max<b[i])116         {117           max=b[i];118         }119       }120       System.out.println("最大子数组和为 "+max);121     }122   }123 }

The Main Code

3.结果截图

4.编程总结

  由于时间问题,此程序编的有些仓促,还有很多不足之处,以及需要优化的地方。在空余时间里,我再继续思考,争取编出一个最起码自己满意的程序。