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

    要求

    1.输入一个整型数组,数组里有正数也有负数。

    2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    3.求所有子数组的和的最大值。要求时间复杂度为O(n)。

    4.要求数组从文件读取

    5.如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。

    思路及源代码

      前三个要求与上一篇要求相同,所以可以在上一次的基础上新增代码实现所需功能。然而,一开始的确实现了一部分功能,但是后来想要实现更多功能时,越改代码bug出现的越多,到最后只能重写。

    package test;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    
    public class FindMaxArray {
        
        public static int length=0;
        
        public static int[] readArray() {
            int[] a = new int[100];
            int t;
            String num="";
            try {
                BufferedReader br = new BufferedReader(new FileReader("Array.txt"));
                while ((t = br.read()) != -1) {
                    if(t==45 && num=="") {    //读到负号
                        num="-";
                        continue;
                    }
                    if(t>=48 && t<=57)     //读到数字
                        num += (char)t;
                    if((t<48 || t>57) && num!="" && num!="-") {   //读到非数字,如果此时num不为空或不为负号则将其转化为int类型
                        a[length++]=Integer.parseInt(num);
                        if(t==45)        //可能没有间隔符,读到的是负号,则赋给num,下次直接使用
                            num="-";
                        else
                            num="";
                    }
                    //如果num为空或为负号,而且读到的是非数字,那么读下一个字符
                }
                if(!(num=="" || num=="-"))   //文件末尾无间隔符或为负号,则录入最后一个数
                    a[length++]=Integer.parseInt(num);
                /*System.out.println(length);
                for(int i=0;i<length;i++)
                    System.out.println(a[i]);*/
                br.close();
            } catch (FileNotFoundException e) {
                System.out.println("文件不存在!");
            } catch (IOException e) {
                System.out.println("文件读取异常,请检查是否拥有文件读取权限!");
            } catch (NumberFormatException e) {
                long n = Long.parseLong(num);
                if(n > 2147483647)
                    System.out.println("第" + length + "个数" + n + "大于整型最大值2147483647!");
                else
                    System.out.println("第" + length + "个数" + n + "小于整型最小值-2147483648!");
            } catch(ArrayIndexOutOfBoundsException e) {
                System.out.println("此程序只支持100个整数内查找最大子数组的和!");
            }
            return a;
        }
        
        public static void findMaxArray(int[] a) {
            int[] b = new int[100];  //数块数组
            b[0] = a[0];
            int j=0,max=0,maxnum=0;
            try {
                for(int i=1;i<length;i++) {
                    if(a[i]<0 && b[j]>0)
                        b[++j] = a[i];
                    else if(a[i]>0 && b[j]<0)
                        b[++j] = a[i];
                    else if(a[i]<=0 && b[j]<0)
                        b[j] += a[i];
                    else if(a[i]>=0 && b[j]>0)
                        b[j] += a[i];
                }
                for(int i=0;i<j;i++)
                    System.out.println(b[i]);
                if(b[0]<=0 && b[1]==0) {    //所有数均小于等于0时
                    max=a[0];
                    for(int i=1;i<10;i++)
                        if(max<a[i])
                            max=a[i];
                } else {
                    max=b[0];
                    for(int i=0;i<=j;i++)
                        if(max<b[i]) {
                            max=b[i];
                            maxnum=i;
                        }
                    int t=0;
                    for(int i=maxnum;i<=j-2;i+=2) {    //从最大数块所在位置向右运算
                        t=t+b[i+1]+b[i+2];         //最大数块右方的数块和,如果存在大于0的,则可以加入最大子数组和的运算
                        if(t>0) {
                            max+=t;
                            t=0;
                        }
                    }
                    t=0;
                    for(int i=maxnum;i>=2;i-=2) {    //从最大数块所在位置向左运算
                        t=t+b[i-1]+b[i-2];         //最大数块左方的数块和,如果存在大于0的,则可以加入最大子数组和的运算
                        if(t>0) {
                            max+=t;
                            t=0;
                        }
                    }
                }
            }catch(NumberFormatException e) {
                System.out.println("运算过程中出现超出整型运算范围的整数!");
            }
            System.out.println("最大子数组的和为:" + max);
        }
        public static void main(String[] args) {
            findMaxArray(readArray());
        }
    }

      未完待续,有空补充

  • 相关阅读:
    旺财速啃H5框架之Bootstrap(二)
    Java 8 的 Nashorn 脚本引擎教程
    kindeditor4整合SyntaxHighlighter,让代码亮起来
    让kindeditor显示高亮代码
    css伪元素用法大全
    弹性布局基础讲解与高效应用
    美化页面,从我做起
    深度理解微信小程序的思想
    程序员提升之道-人际交往篇
    前端-网站构建从零开始
  • 原文地址:https://www.cnblogs.com/dream0-0/p/10546688.html
Copyright © 2011-2022 走看看