• 数组


    设计思想:利用循环的方式逐一求出数组中包含的每个子数组,然后求出数组的和进行比较,求出子数组和的最大值
    遇到的问题:这样求出的子数组和的最大值时间复杂度并没有达到O(n)的要求,后来通过课上的讨论,对于一个有正有负的数组,在我们进行遍历的时可以先找出第一个数,如果遍历的第一个数是负数就舍去直到数为正,然后进行累加看数是否小于零,如果小于0就进行新的累加。代码如下:
     
     
     package geren02;
    import java.util.Scanner;

    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.InputMismatchException;

    public class Wenjian
    {
    public static void main(String[] args)
    {
    long start = System.currentTimeMillis();

    int LENGTH=100000000;//数量
    int FANWEI=10000;//   n  :    -n   ~   +n
    int inum;
    int j=0;
    int m=0;
    int i=0,r=0,k=0;

    String snum="";
    String fileName="number.txt";
    int [] num=new int[LENGTH];
     int array[]=new int[LENGTH];
     long maxsum=array[0];
         long maxstart=array[0];

    try
    {
    File f=new File(fileName);
    if(!f.exists())
    {
    throw new Exception("文件"+fileName+"不存在");
    }
    //写入
    FileWriter fw=new FileWriter(f);
    PrintWriter pw=new PrintWriter(fw);
    for(r=0;r<10;r++)
    {
    for( k=0;k<LENGTH;k++,m++)
    {
    inum=(int)(1+Math.random()*FANWEI*2)-FANWEI;
    pw.print(inum+" ");
    if(m==20)
    {
    pw.print(" ");
    m=0;
    }
    }
    pw.flush();
    }


    //读取

    FileReader fr=new FileReader(f);
    Scanner in=new Scanner(fr);
    if(!in.hasNext())
    {
    throw new Exception("文件"+fileName+"内容为空");
    }
    while(in.hasNext())
    {

    /*if(j>=LENGTH)

    {
    System.out.println("数字过多,多于"+LENGTH+"将不予读取");
    break;
    }*/
     if(maxstart<0)
                {
                    maxstart=0;
                }
                maxstart+=in.nextInt();
                if(maxstart>=(Long.MAX_VALUE/2-1)||maxstart<=(Long.MIN_VALUE/2-1))
                {
                 throw new Exception("数字过大溢出");
                }
                if(maxstart>maxsum)
                    maxsum=maxstart;
    j++;
    }

           
            System.out.println("答案为: "+maxsum);

    }
    catch(InputMismatchException e2)
    {
    System.out.println("数字过大或输入格式不对");
    }
    catch(Exception e)
    {
    System.out.println("错误于: "+i);
    System.out.println("错误!!!");
    System.out.println(e.getMessage());
    e.printStackTrace();
    }


    long end = System.currentTimeMillis();
    System.out.println("程序运行时间:"+(end-start)+"ms");

    }
    }

    总结:这次是第一次的课堂测试,通过上课的讨论了解了大要如何做,所以最开始的设计很重要,以后要先想好在编程。

  • 相关阅读:
    2019牛客暑期多校训练营(第六场)
    2019牛客暑期多校训练营(第五场)
    CCPC-Wannafly Summer Camp 2019 全记录
    2018CCPC吉林赛区 | 部分题解 (HDU6555 HDU6556 HDU6559 HDU6561)
    2006-2007 ACM-ICPC | POJ3380 POJ3384 POJ3385 水题题解
    数论专场 Day9 部分题解
    Catenyms (POJ2337) 字典序最小欧拉路
    2019暑训第一场训练赛 |(2016-icpc区域赛)部分题解
    哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)B 小乐乐搭积木 (状态压缩)
    牛客练习赛32B Xor Path (树形dp)
  • 原文地址:https://www.cnblogs.com/zhang12345/p/10614929.html
Copyright © 2020-2023  润新知