返回一个整数数组中最大子数组的和

问题描述:

设计思想:

首先,此个小程序我会用一个另外的类来完成主要求和。类中第一个方法就是输入,输入数组的长度和数组内的数据;第二个方法来完成子数组求和,首先最大数赋值为数组最后一个数,然后我用while语句循环遍历一次数组算出结果,其中处理过程为:遍历的数如果是正数,首先判断前一个数是否为正,正加上前一个数赋值给此数,然后判断次数是否大于最大数;如果是负数,然后判断是否大于最大数,大则赋值给最大数,否则就加上前一个数赋值给次数。依次循环完毕输出。

出现的问题:

大致写完求和方法后,不能输出结果。调试发现:负数情况下,少考虑了负数不大于最大值的可能。第二次发现有一个bug,比如8 9 -1 2 3的最大值则是17,应该是21

可能的解决方案(多选):

遍历时如果为负数,则要加上前一个数,这样才能避免上面出现的bug

源代码:

//课堂测试
//范亚雷 2016.04.05
//import javax.swing.JOptionPane;
import java.util.*;
class Maxout{
    int[] list=new int[10];
    int max;
    int length;
    Maxout(){}
    
    public void Input(){
        System.out.println("请输入数组的长度:");
        Scanner a=new Scanner(System.in);
        length=a.nextInt();
        Scanner     sca=new Scanner(System.in);
        System.out.println("请依次数组内的数:");  //输入
        for(int i=0;i<length;i++)
        {
            list[i]=sca.nextInt();
        }
        if(length==0||length<0)   //数组为0,报错
        {System.exit(0);}
        
        max=list[length-1];
        //System.out.println(max);
    }
    
   public void Largest(){    //求最大子数组和
    
    while(length>1){
    
   if(list[length-2]>=0)
    {
       
       if(list[length-1]>=0)
        {
            list[length-2]=list[length-2]+list[length-1];
            //System.out.println("1:"+max);
            //Largest();
        }
        
        if(list[length-2]>=max)
        {
            max=list[length-2];
            //System.out.println("2:"+max);
            length--;
                //Largest();
        }
        else
        {length--;}
    }
    
   else
    {
        if(list[length-2]>=max)
        {
            max=list[length-2];
            //System.out.println("4:"+max);
            length--;
            //Largest();
        }
        else
        {
            list[length-2]=list[length-2]+list[length-1];
            length--;
        }
      }
    }    
    
    if(length<2)
      {
        System.out.println("子数组的和最大为为:" + max); //输出max
      }
  }
   
}

 public class OutMax {
    public static void main(String[] args){
        Maxout m=new Maxout();
        m.Input();
        m.Largest();
    }
}

结果截图:

 

总结:

此次编写,出现来了各种可能出现的情况没有考虑充分,对于各种情况的处理分析不够,导致编写的方法不太正确,出现了小问题。因此在编写程序时,要分析清楚各种可能的出现,再去进行编写。

posted @ 2016-04-07 15:59  Fanyalei  阅读(186)  评论(0编辑  收藏  举报