• 个人作业1-——数组


    1.问题

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

         要求: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。

    2.问题分析和设计思想

          拿到这个问题首先是要有一个整形的数组,这个数组中有正数也有负数,并且概率完全相同。这就要用到生成随机数的Math.random()方法产生一个随机数,这个随机数有正有负,就用到一个if语句来决定这个随机数是正是负。最核心的是一个三层循环,最外层循环控制数组的头,中间层控制循环数组的尾,最内层控制数组从头加到尾。这样就实现了求全部子数组的和。然后通过不断比较就得到了最大子数组的和。

    3.源代码

       

    package shuzhu;
    
    import java.util.*;
    
    public class shuzhu {
         public static void main(String[] args)
         {
         Scanner input=new Scanner(System.in);
         System.out.print("请输入数组中数的个数:");
         int num=input.nextInt();
         int max=0;
         
         int a[]=new int[num]; 
         for(int i=0;i<num;i++)//循环生成num个随机数
         {   
             if((int)(Math.random()*2)==0)//先从0或1之间生成一个数,进而决定这个数的正负
            {
                a[i]=(int)(Math.random()*10);
            }
             else
             {
                 a[i]=-(int)(Math.random()*10);
             }
         }
         for(int i=0;i<num;i++)//循环输出生成的num个随机数
         {
            System.out.println(a[i]);
        }
         for(int b=0;b<num;b++)//最外层循环控制这个子数组的头
         {
            for(int c=b;c<=num;c++)//中层循环控制这个子数组的尾
            {
                int sum=0;
                for(int d=b;d<c;d++) //内层循环从头加到尾
                {
                     
                     sum=sum+a[d];
                    
                    if(max<=sum)//通过比较把最大的子数组和赋给max
                    {
                        max=sum;
                    }
                }
            }
         }
        
        System.out.print("子数组和的最大值为:"+max);
         }
    }

    4测试截图

    5总结

         我的这个是最笨的办法实现的这个程序,就是把全部可能的情况求出比较,要另外学习别人先进的思路方法。多多练习。

  • 相关阅读:
    正则表达式收藏
    c#mvc实现登录
    jQuery获取URL中的参数
    TortoiseSVN新人使用指南
    CheckBox获取一组及全选
    day45
    day44
    day43
    day43
    day42
  • 原文地址:https://www.cnblogs.com/xuange1/p/10505996.html
Copyright © 2020-2023  润新知