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);
            
        }
    }
  • 相关阅读:
    【转】算法的时间复杂度
    FFT 物理意义(转)
    【转】FIR学习1
    【转】DFT DTFT DFS FFT的关系
    【转】TCL中的数组
    【转】setup time和hold time的周期问题(slack)
    【转】TCL语法简介
    【转】亚稳态分析
    ubuntu下Samba服务器搭建
    第一次生成uImage出现的问题解决
  • 原文地址:https://www.cnblogs.com/charles-s/p/12377788.html
Copyright © 2011-2022 走看看