用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实现返回一个整数数组中最大数组的和的主要内容,如果未能解决你的问题,请参考以下文章

返回一个整数数组中最大子数组的和(文件)

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

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

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

返回整数数组中最大数组的和(续,文件读入)

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