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

题目:

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

 

要求:

·要求程序必须能处理1000 个元素;

·每个元素是int32 类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;

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

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

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

 

结对编程要求:

·两人结对完成编程任务。

·一人主要负责程序分析,代码编程。

·一人负责代码复审和代码测试计划。

·发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。(截止时间329日晚18:00之前)

 

拓展:

C#int16int32int64的区别

(注:java中没有这些数据类型的这种叫法,这是C#中的叫法,其与java中的shortintlong类型一一对应

 

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.若是大数据,超出数值类型的表示范围,则将整型数据转化为字符串类型进行运算。

 

 

张欢龙主要负责程序分析,代码编程。

李响负责代码复审和代码测试计划。

posted @ 2015-03-29 19:23  巴蒂青葱  阅读(327)  评论(0编辑  收藏  举报