返回一个整型数组中最大子数组的和(2)

1.题目1:返回一个整数数组中最大子数组的和。

要求:

输入一个整形数组,数组里有正数也有负数。

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

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

新情况:

要求数组从文件读取。

如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。

另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃。

程序源代码:

 1 import java.io.BufferedReader;
 2 import java.io.FileInputStream;
 3 import java.io.FileNotFoundException;
 4 import java.io.FileReader;
 5 import java.io.IOException;
 6 import java.util.ArrayList;
 7 import java.util.HashMap;
 8 import java.util.List;
 9 import java.util.Map;
10 public class file {
11   public static void main(String[] args) throws IOException {
12       int num=0;
13       int p[]=new int[1000000];
14       BufferedReader reader = new BufferedReader(new FileReader(
15               "c:\\新建文件夹\\\\2020.2.25.txt"));
16       StringBuffer buffer = new StringBuffer();
17       String line = null;
18       while ((line = reader.readLine()) != null) {
19           buffer.append(line);
20       }
21     reader.close();
22       String str = buffer.toString();
23       str = str.replace(',', ' ');//将逗号用空格替换
24       str = str.replace('.', ' ');//将句号用空格替换
25 //      如果有其他参数,替换就好
26 
27       String[] strings = str.split("\\s+");   // “\\s+”代表一个或多个空格,是正则表达式
28       int array[]=new int[strings.length];
29       for(int i=0;i<strings.length;i++) {
30        array[i]=Integer.parseInt(strings[i]);
31       }
32     int max=0;
33 //  m数组是存放每一轮子数组最大值
34   int m[]=new int[strings.length];
35   for(int j=0;j<strings.length;j++)
36   {
37       max=array[j];
38       int sum=0;
39       for(int t=j;t<strings.length;t++)
40       {
41           if(sum>Integer.MAX_VALUE-array[t]||sum<Integer.MIN_VALUE+array[t])//防止数据溢出
42           {System.out.println("溢出");break;
43           }else {
44           sum=sum+array[t];
45           }
46           if(sum>max)
47           {
48               max=sum;
49           }
50       }
51       m[j]=max;
52   }
53   for(int i=0;i<strings.length;i++)
54   {
55       System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:");
56       System.out.println(m[i]);
57   }
58   for(int i=1;i<strings.length;i++)
59   {
60       max=m[0];
61       if(m[i]>max)
62       {
63           max=m[i];
64       }
65   }
66   System.out.print("子数组和的最大值为:"+max);
67   }
68 }

运行结果截图:

 

猜你喜欢

转载自www.cnblogs.com/a155-/p/12364195.html
今日推荐