返回一个整数数组中最大子数组的和02

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

要求:

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

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

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

 

新情况:

要求数组从文件读取。

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

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

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class file {
public static void main(String[] args) throws IOException {
int num=0;
int p[]=new int[1000000];
BufferedReader reader = new BufferedReader(new FileReader(
"c:\\新建文件夹\\\\2020.2.25.txt"));
StringBuffer buffer = new StringBuffer();
String line = null;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
reader.close();
String str = buffer.toString();
str = str.replace(',', ' ');//将逗号用空格替换
str = str.replace('.', ' ');//将句号用空格替换
// 如果有其他参数,替换就好

String[] strings = str.split("\\s+"); // “\\s+”代表一个或多个空格,是正则表达式
int array[]=new int[strings.length];
for(int i=0;i<strings.length;i++) {
array[i]=Integer.parseInt(strings[i]);
}
int max=0;
// m数组是存放每一轮子数组最大值
int m[]=new int[strings.length];
for(int j=0;j<strings.length;j++)
{
max=array[j];
int sum=0;
for(int t=j;t<strings.length;t++)
{
if(sum>Integer.MAX_VALUE-array[t]||sum<Integer.MIN_VALUE+array[t])//防止数据溢出
{System.out.println("溢出");break;
}else {
sum=sum+array[t];
}
if(sum>max)
{
max=sum;
}
}
m[j]=max;
}
for(int i=0;i<strings.length;i++)
{
System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:");
System.out.println(m[i]);
}
for(int i=1;i<strings.length;i++)
{
max=m[0];
if(m[i]>max)
{
max=m[i];
}
}
System.out.print("子数组和的最大值为:"+max);
}
}

posted @ 2022-03-18 12:17  青玄吖  阅读(33)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end