zoukankan      html  css  js  c++  java
  • 数组

    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

     
  • 相关阅读:
    AtCoder Tenka1 Programmer Beginner Contest 解题报告
    BZOJ4401: 块的计数 思维题
    LOJ#2170. 「POI2011」木棍 Sticks
    LOJ#2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On
    LuoguP3183 [HAOI2016]食物链 记忆化搜索
    BZOJ2818: Gcd 欧拉函数
    BZOJ3942: [Usaco2015 Feb]Censoring 栈+KMP
    适用于Java的嵌入式脚本语言
    oracle goldengate的两种用法
    手滑把库给删了,跑路前应该做的事。。。
  • 原文地址:https://www.cnblogs.com/zchenjian/p/4361102.html
Copyright © 2011-2022 走看看