个人作业:返回一个整数数组中最大子数组的和。文件读取版(超大数版)
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)
发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。
新情况:
要求数组从文件读取。
如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。
另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃。
思路:在之前的测试中int类型足以可以应付所有的数字,但为了防止溢出本次我选择了用BigInteger来作为变量,我思路是每次用sum来加每一个从文件中读取出来的数,然后对读取数来进行判断如果他是一个负数则对sum进行新的赋值为零,因为要连续的最大数组的值当出现一个负数时则不会是他最大的值会使他减小,然后每次讲Max和sum进行对比如果Max小于sum则对这个进行新的赋值为sum,在每次进行sum相加时我先对文件中的字符进行判断是否是由数字组成,我从网络中查到了运用正则表达式的方法最为简便所以“^[-\\+]?[\\d]*$”这个正则是相对效率较高的一个。
代码:
package 啊哈哈; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.math.BigInteger; import java.util.regex.Pattern; public class test { public static void main(String[] args) { BigInteger sum=new BigInteger("0"); BigInteger max=new BigInteger("0"); try { BufferedReader reader=new BufferedReader(new FileReader("F:\\qq\\spp.txt")); String a; while((a=reader.readLine())!=null) { if(!isInteger(a)) { System.out.println("其中包含非法字母"); break; } BigInteger c=new BigInteger(a); sum=sum.add(c); System.out.println(sum); if(c.compareTo(BigInteger.ZERO)==-1) { sum=new BigInteger("0"); } if(sum.compareTo(max)==1) { max=sum; } } } catch ( IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } System.out.println("最大数为"+max); } public static boolean isInteger(String str) { Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); return pattern.matcher(str).matches(); } }
测试结果
当其中含有字符时: