首页 > 技术文章 > 软件工程个人作业04

love528 2016-04-08 17:20 原文

设计思想

用户设定数组长度及其数值,定义sum的初值为0,max初值为数组第一个数,所求子数组的初始位置为0,进行一次遍历,sum依次与数组的数叠加,若和为正数,则证明目前的子数组之和为最大。若和为负数,则记此位置为startIndex,即记录下一个位置的数,当sum大于max时,给max赋值,记此位置为endIndex,如此进行一次循环即可。

出现的问题

用户输入数组数值可能会越界

可能的解决方案(多选)

判断用户输入数的个数,错误时重新输入。

源代码

import java.util.Scanner;
public class Submax {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        System.out.println("please input the number of the array date");
        int a=in.nextInt();
        int []date=new int[a];
        System.out.println("input the number (Int):");
        for(int i=0;i<a;i++)         //用户输入数字
        {
            date[i]=in.nextInt();
        }
        int sum=0,max=date[0];
        int startIndex=0,endIndex=0;
        for(int i=0;i<a;i++)        //进行一次遍历
        {
            if(sum>=0)
            {
                sum+=date[i];         //和为正数时一直相加
            }
            else
            {
                sum=date[i];
                startIndex=i;         //和为负数时记录下一个数
            }
            if(sum>max)
            {
                max=sum;
                endIndex=i;            //求最大值
            }
        }
        System.out.println("the max subarray is:");
        for(int i=startIndex;i<=endIndex;i++)
        {
            System.out.println(date[i]+"  ");//输出子数组
        }
        System.out.println("the max is:"+max);
    }

}

 

结果截图

总结

许多看起来很难的程序也会有简单的解决之道,需勤动手动脑。

推荐阅读