zoukankan      html  css  js  c++  java
  • 数组

    设计思想:利用循环的方式逐一求出数组中包含的每个子数组,然后求出数组的和进行比较,求出子数组和的最大值
    遇到的问题:这样求出的子数组和的最大值时间复杂度并没有达到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");

    }
    }

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

  • 相关阅读:
    Unity 摄像机旋转跟随缩放控制
    Unity 协程深入解析与原理
    好看的滚动条
    ES6编译问题SyntaxError: Unexpected token import
    Axure rp8 注册码,亲测可以用! 可用给个赞呗!!
    angular 项目中遇到rxjs error TS1005:';'
    window 查看端口 杀端口
    angular 中嵌套 iframe 报错
    js 快速生成数组的方法
    ng-packagr 不能全部打包文件
  • 原文地址:https://www.cnblogs.com/zhang12345/p/10614929.html
Copyright © 2011-2022 走看看