返回一个整数数组中最大子数组的和
题目:
返回一个整数数组中最大子数组的和。
要求:
·要求程序必须能处理1000 个元素;
·每个元素是int32 类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
·输入一个整形数组,数组里有正数也有负数。
·数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
·求所有子数组的和的最大值。要求时间复杂度为O(n)。
结对编程要求:
·两人结对完成编程任务。
·一人主要负责程序分析,代码编程。
·一人负责代码复审和代码测试计划。
·发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。(截止时间3月29日晚18:00之前)
拓展:
C#中int16、int32、int64的区别
(注:java中没有这些数据类型的这种叫法,这是C#中的叫法,其与java中的short、int、long类型一一对应)
Int16值类型表示值介于-32768到+32768之间的有符号整数。
Int32值类型表示值介于 -2,147,483,648 到 +2,147,483,647 之间的有符号整数。
Int64 值类型表示值介于 -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 之间的整数。
short 关键字表示一种整数数据类型,该类型根据下表显示的大小和范围存储值。
类型 |
范围 |
大小 |
.NET Framework 类型 |
short |
-32,768 到 32,767 |
有符号 16 位整数 |
System.Int16 |
----------------------------------------------------------------------------------------------------------------------------------------
int 关键字表示一种整型,该类型根据下表显示的大小和范围存储值。
类型 |
范围 |
大小 |
.NET Framework 类型 |
int |
-2,147,483,648 到 2,147,483,647 |
有符号 32 位整数 |
System.Int32 |
----------------------------------------------------------------------------------------------------------------------------------------
long 关键字表示一种整型,该类型根据下表显示的大小和范围存储值。
类型 |
范围 |
大小 |
.NET Framework 类型 |
long |
-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
有符号 64 位整数 |
System.Int64 |
设计思想
在上一道练习的基础上,修改整型数组的长度使其长度为100000,然后用户在输入产生随机数的个数时,输入1000,即可满足本体要求必须能处理1000个元素。
程序源代码
import java.util.Random;
import java.util.Scanner;
public class zuidazishuzu2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
int array[]=new int[100000];
int flag1=0;
int flag2=0;
int flagTemp1=0;
int flagTemp2=0;//分别记录子数列的起始和结束位置
int sum,sumTemp;//表示子数列的和
Random r=new Random();
System.out.print("请输入数组元素的个数: ");
Scanner sc=new Scanner(System.in);
int number=sc.nextInt();
System.out.println("--------------------------------" +
"------------------------------------------");
System.out.print("产生的随机数序列为: ");
for(int i=0;i<number;i++){
array[i]=r.nextInt()%10;
System.out.print(array[i]+" ");
}
System.out.println("");
sum=array[0];
sumTemp=sum;
for(int i=0;i<number;i++){
if(sumTemp<=0){
sumTemp=0;
flagTemp1=i+1;
flagTemp2=i;
}
sumTemp+=array[i+1];
flagTemp2++;
if(sumTemp>sum){
sum=sumTemp;
flag1=flagTemp1;
flag2=flagTemp2;
}
}
System.out.print("子数组的组成元素为: ");
for(int i=flag1;i<=flag2;i++)
System.out.print(array[i]+" ");
System.out.println('\n'+"子数组和的最大值为: "+sum);
}
}
当输入数组元素个数为1000时的显示结果
当输入数组元素个数为10000时的显示结果
当输入数组元素个数为15000时的显示结果
当输入数组元素个数为99999时的显示结果
总结:
由截图可以看出虽然子数列和的最大值没有超出int表示的范围,但是结果显示的格式发生了变化:子数组组成元素显示了两次,产生的随机数序列显示的位置发生了变化。可见当数据的数量达到一定程度时,程序不会报错但会发生各种不同的错误输出,因此在以后的编程过程中要,当数据较大时,要有注意数据类型的选取的意识!
可能的解决方案
1.若知道数据的范围,可以选择适当的数值类型。
2.若是大数据,超出数值类型的表示范围,则将整型数据转化为字符串类型进行运算。
张欢龙主要负责程序分析,代码编程。
李响负责代码复审和代码测试计划。