今天研究了一下如何返回一个整数数组中最大数组的和,具体要求如下:
分析:
对于这个问题可以设定一个整型max,让他来充当子数组的和的最大值,之后就需要让他和所有的子数组进行比较,这里可以用两个for循环来实现.如下:
for(int i=0;i
{
for(int j=i;j
{
s[z]=s[z]+f[j];
if(max
max=s[z];
}
}
实现这一部之后,问题便已经解决了一半,接下来便要考虑一下如何生成这个整形数组了.这里可以用随机函数来实现,但要求既有证书,又有负数,所以从网上找到了
一个简单的生成正负随机数的函数.
private static intRD(){
Random random= newRandom();int n = random.nextInt(10);if(n==1||n==3||n==5||n==7||n==9){//如果是13579进入负数生产机器
String str= "-"+random.nextInt(100);//加个负号
int a = Integer.parseInt(str);//把字符串str封装成实数a
returna;
}else{//否则产生正数,也就是说02468产生正数
int a = random.nextInt(100);returna;
}
}
以上两个难点解决了,剩下的问题就变得简单了.
源代码如下:
package piao;
import java.util.Random;
public class text {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Random random = new Random();
int n = random.nextInt(100);
int f[]=new int[n];
for(int i=0;i
{
f[i]=RD();
System.out.println(f[i]);
}
/*
* int n=5;
int f[]=new int[n];
f[0]=1;f[1]=3;f[2]=-5;f[3]=2;f[4]=-2;
*/
int num=n;
int s[]=new int[num];
for(int i=0;i
{
s[i]=0;
}
int z=0;
int max=f[0];
for(int i=0;i
{
for(int j=i;j
{
s[z]=s[z]+f[j];
if(max
max=s[z];
}
/*for(int j=n-i, m=0;j
{
s[z]=s[z]+f[m];
if(max
max=s[z];
}
s[z]=max;
z++;
*/
}
System.out.println("最大为:"+max);
}
private static int RD(){
Random random = new Random();
int n = random.nextInt(10);
if(n==1||n==3||n==5||n==7||n==9){
//如果是13579进入负数生产机器
String str = "-"+random.nextInt(100);//加个负号
int a = Integer.parseInt(str);//把字符串str封装成实数a
return a;
}else{
//否则产生正数,也就是说02468产生正数
int a = random.nextInt(100);
return a;
}
}
}
使用定值数组[1,3,-5,2,-2]测试结果:
运行结果:
拓展1.若给出的为一个首尾相接的整数环,如何修改?
环与线之间唯一的区别在于在max的比较时要考虑子数组的变化,在尾部后还可以连接到首部,
因此需要将源式修改为:
for(int i=0;i
{for(int j=i;j
{
s[z]=s[z]+f[j];if(max
max=s[z];
}for(int j=n-i, m=0;j
{
s[z]=s[z]+f[m];if(max
max=s[z];
}
s[z]=max;
z++;
}
使用定值数组[1,3,-5,-2,2]测试结果:
运行结果:
拓展二:
实现在文件中输入:
首先在绝对路径下新建一个a.txt,如图:
原代码:
package piao;
import java.io.FileReader;
import java.io.IOException;
import java.util.Random;
public class text {
public static void main(String[] args)throws IOException {
// TODO 自动生成的方法存根
//初始化
FileReader fr=new FileReader("a.txt");
//int read()一次只读一个字符,输出字符需要将其转换为char类型。
int h=fr.read();
int f[]=new int[5];
int n=5;
System.out.print((char)h);
String v[]=new String[5];
for(int i=0;i<5;i++)
v[i]="";
v[0]=""+(char)h;
int x=0;
//当fr.read()输出值为-1时,所有字符都输出完毕。
while((h=fr.read())!=-1)
{
System.out.print((char)h);
if((char)h==',')
{
x++;
}else
v[x]=v[x]+(char)h;
}
for(int i=0;i<5;i++)
f[i]=Integer.parseInt(v[i]);
/*Random random = new Random();
int n = random.nextInt(100);
int f[]=new int[n];
for(int i=0;i
{
f[i]=RD();
//System.out.println(f[i]);
}
/*int n=5;
int f[]=new int[n];
f[0]=1;f[1]=3;f[2]=-5;f[3]=-2;f[4]=2;
*/
int num=n;
int s[]=new int[num];
for(int i=0;i
{
s[i]=0;
}
int z=0;
int max=f[0];
for(int i=0;i
{
for(int j=i;j
{
s[z]=s[z]+f[j];
if(max
max=s[z];
}
for(int j=n-i, m=0;j
{
s[z]=s[z]+f[m];
if(max
max=s[z];
}
s[z]=max;
z++;
}
System.out.println("最大为:"+max);
fr.close();
}
private static int RD(){
Random random = new Random();
int n = random.nextInt(10);
if(n==1||n==3||n==5||n==7||n==9){
//如果是13579进入负数生产机器
String str = "-"+random.nextInt(100);//加个负号
int a = Integer.parseInt(str);//把字符串str封装成实数a
return a;
}else{
//否则产生正数,也就是说02468产生正数
int a = random.nextInt(100);
return a;
}
}
}
结果截图:
拓展三:考虑数组很大以及程序崩溃的情况.
将输入由int改为String,进行处理.若数据输入有问题则用判断加异常抛出跳过对数据的处理直接
退出.