设计思想:利用循环的方式逐一求出数组中包含的每个子数组,然后求出数组的和进行比较,求出子数组和的最大值
遇到的问题:这样求出的子数组和的最大值时间复杂度并没有达到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");
}
}
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");
}
}
总结:这次是第一次的课堂测试,通过上课的讨论了解了大要如何做,所以最开始的设计很重要,以后要先想好在编程。