求数组的子数组之和的最大值II

这次在求数组的子数组之和的最大值的条件下又增加了新的约束:

   1.要求数组从文件读取。
      2.如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。
      3.另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃。

设计思路:

  1.首先就是对文件的读取,从文件中读取数组,将按行读取的数组进行分割,存储

  2.接入求最大值函数,调用数组,调整类型,对于大数进行处理,在求数组的子数组之和的最大值处参考了O(n)的算法

  3.对文件读取等进行异常处理

 

截图:

 

  1 package test2;
  2 import java.io.BufferedReader;
  3 import java.io.File;
  4 import java.io.FileReader;
  5 import java.io.IOException;
  6 import java.util.ArrayList;
  7  
  8 public class shuzu2 {
  9     
 10     public static void readFileByLines(String fileName) {
 11         File file = new File(fileName);
 12         BufferedReader reader = null;
 13         try {
 14             reader = new BufferedReader(new FileReader(file));
 15             String tempString = null;
 16            
 17             while ((tempString = reader.readLine()) != null) {
 18 
 19                 System.out.println(tempString);
 20                 
 21             }
 22             reader.close();
 23         } catch (IOException e) {
 24             e.printStackTrace();
 25         } finally {
 26             if (reader != null) {
 27                 try {
 28                     reader.close();
 29                 } catch (IOException e1) {
 30                 }
 31             }
 32         }
 33     }
 34     
 35     public static long[] toArrayByFileReader1(String name) {
 36         // 使用ArrayList来存储每行读取到的字符串
 37         ArrayList<String> arrayList = new ArrayList<>();
 38         try {
 39             FileReader fr = new FileReader(name);
 40             BufferedReader bf = new BufferedReader(fr);
 41             String str;
 42             // 按行读取字符串
 43             while ((str = bf.readLine()) != null) {
 44                 arrayList.add(str);
 45             }
 46             bf.close();
 47             fr.close();
 48         } catch (IOException e) {
 49             e.printStackTrace();
 50         }
 51         // 对ArrayList中存储的字符串进行处理
 52         int length = arrayList.size();
 53         long[] array = new long[length];
 54         for (int i = 0; i < length; i++) {
 55             String s = arrayList.get(i);
 56             array[i] = Long.parseLong(s);
 57         }
 58         
 59         long f=0;//定义整形变量f,为子数组最大值
 60         long sum=0;//定义整形变量sum,为子数组求和
 61         for(int i=0;i<length;i++)
 62         {
 63             sum = sum+array[i];
 64             if(sum < 0)
 65             {
 66                 sum=0;
 67             }
 68             if(sum > f)
 69             {
 70                 f = sum;
 71             }
 72         }
 73         
 74         if(sum == 0)
 75         {
 76             for(int i=0;i<length;i++)
 77             {
 78                 if(i == 0)
 79                 {
 80                     f = array[i];
 81                 }
 82                 if(f < array[i])
 83                 {
 84                     f = array[i];
 85                 }
 86             }
 87         }
 88         
 89         System.out.println("该数组的子数组之和的最大值为:"+f);
 90         
 91         
 92         // 返回数组
 93         return array;
 94     }
 95 
 96     
 97     public static void main(String[] args) throws IOException{
 98        
 99         String name = new String("E:\\Program Files\\eclipse操作\\shuzu\\src\\test2\\input.txt");
100         
101         readFileByLines(name);
102         toArrayByFileReader1(name);//文件路径
103        
104     }
105 }

 

反思:

对于大数的处理还不是很熟悉,在课上听同学们的交流,应该采用随机生成数的方式,随机产生随机个数的数字,用来测试读取数字的最大个数,这一点没有实现,还有异常处理也没有实现,对于不合法数字、文件读取等方面的处理还不会。这次更充分的体现了分步的重要性,如果不分步的话,会感觉到十分吃力,会感觉到无从下手,这种东西还是得多练。

posted @ 2019-03-17 11:07  枫黎  阅读(233)  评论(0编辑  收藏  举报