• 数组


    1. 题目:

       输入一个整形数组,数组里有正数也有负数。

       数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

       求所有子数组的和的最大值。要求时间复杂度为O(n)。

    2. 设计思想

       这个程序乍一看特别简单,一个新手都会,但仔细一想,才发现其中的难度。空间复杂度为O(n),这个就比较难了。、

       首先产生N个随机数,下面就是核心部分,

       我的想法是用for循环,但是根据题目要求只能用一次循环,想了很久才发现,可以进行一次次判定,我把我的思想分成来两部分:

            1. 在这个循环中,把前几个相加,看是否是整数。

            2. 其次看(i+1)的和是否大于(i)的和。

       根据这就可以用一个循环来进行计算。接下来就是考虑其他的问题,比如最大子数组的起始位置和最终位置。把这个加入到for循环中,用if条件语句进行判断。最后输出即可。

    3. 源代码

    import java.util.Random;
    import java.util.Scanner;
    
    
    public class main {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int a[]=new int[100];
            int sum,d,temp1=0,temp2=0,flag1=0,flag2=0;  //分别记录子数列的起始和结束位置
            System.out.print("请输入数组元素的个数:(小于100) ");
            Scanner sc=new Scanner(System.in);
            int m=sc.nextInt();
            Random rand = new Random();
            for(int i=0;i<m;i++)//循环为数组赋值
            {
                a[i] = rand.nextInt(40)-20;
                System.out.print(a[i]+" ");
            }
            sum=a[0];
            d=sum;
            for(int i=0;i<m;i++)//核心循环,来判断怎么产生最大子数组
            {
                if(d<=0){
                    d=0;
                    temp1=i+1;
                    temp2=i;
                }        
                d+=a[i+1];
                temp2++;
                if(d>sum){
                    sum=d;
                    flag1=temp1;
                    flag2=temp2;
                }
            }
            System.out.println("");
            System.out.print("子数组的组成元素为:    ");
            for(int i=flag1;i<=flag2;i++)
                System.out.print(a[i]+" ");
            System.out.println("");
            System.out.println("子数组和的最大值为:    "+sum);
    
        }
    
    }

    4. 运行结果截图

    5. 周活动总结表

                                                                                                         周活动总结表

                                                            姓名:张晨建                                                                    日期:2015-03-23

     

    听课

    编写程序

    阅读课本

    日总计

    周日

    70

    30

    100

    周一

    240

    20

    260

    周二

    500

    500

    周三

    120

    60

    180

    周四

    360

    40

    400

    周五

    360

    20

    380

    周六

    120

    80

    60

    260

    周总计

    1900

    210

    170

    2280

                                                             阶段时间和效率                                            周数(上一周活动总结的周数+1):1

                                                             不包括在上一周内的累计时间

    总计

     1700

     100

     20

     1820

    平均

     1700

     100

     20

     1820

    最大

     1700

     100

     20

     1820

    最小

     1700

     100

     20

     1820

                                                            以前各周的累计时间

    总计

     1700

     100

     20

     1820

    平均

     1700

     100

     20

     1820

    最大

     1700

     100

     20

     1820

    最小

     1700

     100

     20

    1820

     6. 时间记录日志:

                                                      学生:张晨建                                                                                 日期:3/23/2015

                                                      教师:王建民                                                                                 课程:软件工程概论

     日期

    开始时间 

    结束时间 

    中断时间 

    净时间 

    活动 

     备注

     3-20

     10:10

     12:00

    10 

    100 

     上课

     软件时间概论

     3-20----3-21

     剩余时间上课和休息

     3-22

     9;00

     11:30

     0

     150

     编程

     3-23

     4:00

     7:00

     0

     180

     编程

     

    7. 缺陷记录日志

                                                     学生:张晨建                                                                                日期:3/23/2015

                                                     教师: 王建民                                                                                         程序:数组

    日期

    编号

    修复时间

    修复缺陷

    描述

    3-22

    1

    20

    产生随机负数

    修复了无法产生随机负数的bug

    3-23

    2

    120

    求最大数组

    修复了求最大子数组一直出现全部的bug

     
  • 相关阅读:
    CentOS 6.5 源码安装subversion-1.8.8,附加mod_dav_svn模块
    MySQL建表设置外键提示错误
    Servlet3.0提供的异步处理
    Servlet3.0使用@WebServlet注解配置问题记录
    我的博客开通啦!
    关于Wii的蓝牙接收
    关于Wii的软件制作
    提升学习算法简述:AdaBoost, GBDT和XGBoost
    决策树中的熵和基尼指数
    机器学习排序算法:RankNet to LambdaRank to LambdaMART
  • 原文地址:https://www.cnblogs.com/zchenjian/p/4361102.html
Copyright © 2020-2023  润新知