设计思路:首先要实现随机生成一个范围内的整数写入txt文件,然后从文件中读取信息(按行读取,还是一行一行的读空格来分离数据)。然后需要判断读入的信息是不是整数(考虑到不是自己生成的txt),其次保证数组长度可以很大,以及数组中含有特别大的数,程序可以正常运行。
package SHUZU;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class shuzu {
public static int random_num(int a,int b)//一定范围内随机数获取
{
int c=(int) (Math.random()*(b-a+1));
return c+a;
}
public static void WriterFun(){
//写入文本文档中
File file = new File("input.txt");
if(!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
for(int i=0;i<1000;i++){
int nums = random_num(-1000000,2000000);
//将int 转化为 String类型
if(i!=0)
bw.write(" "+Integer.toString(nums));
else bw.write(Integer.toString(nums));
//bw.newLine();
}
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
WriterFun();//调用
// int a[]=new int[10];
// Scanner input=new Scanner(System.in);
// for(int i=0;i<=9;i++)
// {
// a[i]=input.nextInt();
// }
// input.close();
List<Integer> shuzu=new ArrayList<Integer>();//构建List集合将读取的信息存到shuzu中
String pathname = "input.txt";
try ( FileReader reader = new FileReader(pathname);
BufferedReader br = new BufferedReader(reader)
){
String line;
while ((line = br.readLine()) != null) {
// 一次读入一行数据
String []strlist=line.split(" ");//按空格来拆分字符串
for(String it:strlist)
{
Pattern p=Pattern.compile("-?[0-9]*");//正则表达式判断每一个拆分的数据是否符合规定的标准
Matcher m=p.matcher(it);
if(m.matches())
{
int i;
i=Integer.parseInt(it);
shuzu.add(i);
}
else
{
System.out.println("文件中含有非法字符");
return;
}
}
//System.out.println(line);
}
// System.out.println(shuzu.get(shuzu.size()-1));
} catch (IOException e) {
e.printStackTrace();
}
List<Integer> all=new ArrayList<Integer>();
for(int j=-1;j<=(shuzu.size()-2);j++)
{
int sum=0;
for(int i=j+1;(i<=shuzu.size()-1);i++)
{
sum=sum+shuzu.get(i);
//System.out.println(sum);
all.add(sum);
}
}
Collections.sort(all);
System.out.println(all.get(all.size()-1));
}
}
运行结果:
反思:当数组长度超过5000且数在-1000000到2000000之间时(一种情况)程序崩溃,原因是将所有的子数组和都存到了一个集合中,然后进行排序来获取最大值,时间复杂度为O(n2),当数组长度为5000时连续的子数组个数是n为4999,2为公差,首项为1,尾为4999的等差数列的和。所以需要将时间复杂度控制在O(n),并且需要将大数加法转化为字符串来计算。