用java实现返回一个整数数组中最大数组的和
Posted 西西里啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java实现返回一个整数数组中最大数组的和相关的知识,希望对你有一定的参考价值。
今天研究了一下如何返回一个整数数组中最大数组的和,具体要求如下:
分析:
对于这个问题可以设定一个整型max,让他来充当子数组的和的最大值,之后就需要让他和所有的子数组进行比较,这里可以用两个for循环来实现.如下:
for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { s[z]=s[z]+f[j]; if(max<s[z]) max=s[z]; } }
实现这一部之后,问题便已经解决了一半,接下来便要考虑一下如何生成这个整形数组了.这里可以用随机函数来实现,但要求既有证书,又有负数,所以从网上找到了
一个简单的生成正负随机数的函数.
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; } }
以上两个难点解决了,剩下的问题就变得简单了.
源代码如下:
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<n;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<num;i++) { s[i]=0; } int z=0; int max=f[0]; for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { s[z]=s[z]+f[j]; if(max<s[z]) max=s[z]; } /* for(int j=n-i, m=0;j<n;j++,m++) { s[z]=s[z]+f[m]; if(max<s[z]) 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<n;i++) { for(int j=i;j<n;j++) { s[z]=s[z]+f[j]; if(max<s[z]) max=s[z]; } for(int j=n-i, m=0;j<n;j++,m++) { s[z]=s[z]+f[m]; if(max<s[z]) 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<n;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<num;i++) { s[i]=0; } int z=0; int max=f[0]; for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { s[z]=s[z]+f[j]; if(max<s[z]) max=s[z]; } for(int j=n-i, m=0;j<n;j++,m++) { s[z]=s[z]+f[m]; if(max<s[z]) 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,进行处理.若数据输入有问题则用判断加异常抛出跳过对数据的处理直接
退出.
以上是关于用java实现返回一个整数数组中最大数组的和的主要内容,如果未能解决你的问题,请参考以下文章