zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大子数组的和(2)

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

    源代码:

    package test;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Random;
    import java.util.Scanner;
    
    public class The_second_test {
    
        public static void main(String[] args) throws IOException {
            /**
             * 数据定义
             */
            double a[] = new double[50000000];
            double b[] = new double[50000000]; // 用于储存子数组的最大值
            
            /**
             * 文本数据写入
             */
            FileWriter fs = new FileWriter("D:\test.txt");
            try {
                Random random = new Random(System.currentTimeMillis());
                for(int i=0;i<30000000;i++) {
                    int as = random.nextInt(1000)+1;
                    fs.write(as+" ");
                }
                
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            finally {
                if(fs!=null)
                fs.close();
            }
            
            /**
             * 文本数据导入
             */
            try (Scanner scanner = new Scanner(new BufferedReader(new FileReader(
                    "D:\test.txt")));) {
                int n=0;
                scanner.useDelimiter("[?|,|。|' ']");
                while (scanner.hasNext()) {
                    double s = Double.parseDouble(scanner.next());
                    a[n]=s;
                    n++;
                    System.out.println(s);
                    if(n>=200000000) {
                        System.out.println("数据量过大!请重新设置一个小200000个的数组");
                        System.exit(0);
                    }
                }
            } catch (FileNotFoundException e) {
                System.out.println("文件打开失败");
                e.printStackTrace();
                System.exit(0);
            }
            
            
            b[0] = a[0];
            /**
             * 统计所有以一开头的子数组
             */
            for (int i = 1; i < a.length; i++) {
                b[i] = b[i - 1] + a[i];
            }
            double max = b[0];
            int mas, mis;
            mas = mis = 0;
            double min = b[0];
            /**
             * 比较这些子数组里的最大值和最小值
             */
            for (int i = 1; i < b.length; i++) {
                if (max < b[i]) {
                    max = b[i];
                    mas = i;
                }
                if (min > b[i]) {
                    min = b[i];
                    mis = i;
                }
            }
            /**
             * 判断最小子数组的成员个数是否大于最大子数组的成员个数
             */
            if (mis > mas) {
                min = b[0];
                mis=0;
                for (int i = 0; i <= mas; i++) {
                    if (min > b[i]) {
                        min = b[i];
                        mis=i;
                    }
                }
            }
            /**
             * 判断最小子数组的和值是否小于零
             */
            if(mis!=0)
            {
                if (min <= 0)
                    System.out.println("最大子数组的值为" + (max - min));
                else
                    System.out.println("最大子数组的值为" + max);
            }else
                System.out.println("最大子数组的值为" + max);
            
        }
    }
  • 相关阅读:
    !!!最常用正则表达式语法
    RunMessageScript from spy
    已知进程、线程、窗体三者中某一个的句柄,需要查找另外两者的句柄。
    如何抓取一个当前运行软件所使用的内存
    谢谢你的伤害
    游摸底河有感
    九月无诗
    游石人公园有感
    影响35岁前成功的好习惯与坏习惯
    创业经验十二谈,愿有志者共勉(转)
  • 原文地址:https://www.cnblogs.com/charles-s/p/12377788.html
Copyright © 2011-2022 走看看