zoukankan      html  css  js  c++  java
  • 求数组的子数组之和的最大值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 }

    反思:

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

  • 相关阅读:
    再起航,我的学习笔记之JavaScript设计模式13(装饰者模式)
    在 ASP.NET Core 中执行租户服务
    再起航,我的学习笔记之JavaScript设计模式12(适配器模式)
    再起航,我的学习笔记之JavaScript设计模式11(外观模式)
    再起航,我的学习笔记之JavaScript设计模式10(单例模式)
    Entity Framework Core 2.0 全局查询过滤器
    再起航,我的学习笔记之JavaScript设计模式09(原型模式)
    APScheduler
    Gvim打造python编辑器,附自己的配置文件
    Python通过logging记录日志并应用coloredlogs在控制台输出有色字体
  • 原文地址:https://www.cnblogs.com/flw0322/p/10569421.html
Copyright © 2011-2022 走看看