数组

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

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


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

}
}

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

posted on 2019-03-10 13:49  啥123  阅读(127)  评论(0编辑  收藏  举报