设计思路:首先要实现随机生成一个范围内的整数写入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),并且需要将大数加法转化为字符串来计算。