1.返回一个数组中最大子数组的和
要求:输入一个整形数组,数组里有正也有负数
数组中连续的一个或多个数组组成一个子数组,每个子数组都有一个和
求所有子数组的和的最大值,要求时间复杂度为O(n)
思路:另设两个数组,一个记录和b[],一个记录当前子数组的个数c[]。如果原数组的第二个数加上第一个数的和小于第二个数,那么舍弃第一个数,当前子数组的个数为一。由此类推,直到遍历完所有数组。
package test; import java.util.Random; import java.util.Scanner; public class array_test { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int[] num=new int[20]; int number=0; int[] array1=new int[20]; int a=scanner.nextInt(); for(int i=0;i<a;i++) { //随机生成数组里的数字 array1[i]=scanner.nextInt(); } num[0]=array1[0]; for (int i = 1; i < array1.length; i++) { if(array1[i]+array1[i-1]>array1[i]) { num[i]=num[i-1]+array1[i]; number=i+1; } else { num[i]=array1[i]; } } int max=num[0]; for(int i=1;i<num.length;i++) { System.out.print(num[i]); if(num[i]>max) max=num[i]; } System.out.print(max); System.out.print(" "); } }
2.求一个循环数组中最大子数组的和
要求:在第一问的前提下,将原数组变为循环数组
思路:将原数组循环赋值,直到子数组的个数大于原数组的个数时停止
import java.util.Random; import java.util.Scanner; public class huan { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int a[]=new int[10000]; int b[]=new int[20000]; int sum,d,temp1=0,temp2=0,flag1=0,flag2=0; //分别记录子数列的起始和结束位置 System.out.print("请输入数组元素的个数: "); Scanner sc=new Scanner(System.in); int m=sc.nextInt(); if(m>999999) { System.out.print("请重新输入数组元素的个数: "); m=sc.nextInt(); } Random rand = new Random(); for(int i=0;i<m;i++)//循环为数组赋值 { a[i] = rand.nextInt(40)-20; b[i] = a[i]; b[i+m]=a[i]; System.out.print(a[i]+" "); } sum=b[0]; d=sum; for(int i=0;i<2*m;i++)//核心循环,来判断怎么产生最大子数组 { if(d<=0){ d=0; temp1=i+1; temp2=i; } d+=b[i+1]; temp2++; if(d>sum){ sum=d; flag1=temp1; flag2=temp2; if((flag2-flag1+1)>=m) { break; } } } System.out.println(""); System.out.print("子数组的组成元素为: "); for(int i=flag1;i<=flag2;i++) System.out.print(b[i]+" "); System.out.println(""); System.out.println("子数组和的最大值为: "+sum); } }
3.要求数组从文件中读取
要求:数组从文件中读取
如果输入的数组过大,考虑一下数的溢出
保证文件中错误的参数不能导致程序的崩溃
package test; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class array_test2 { public static void main(String[] args) throws IOException { FileReader fileReader=new FileReader("C:\\Users\\admin\\Desktop\\QQ\\test.txt"); BufferedReader bReader=new BufferedReader(fileReader); StringBuffer stringBuffer=new StringBuffer(); String[] strings=new String[50]; String bb; String s=""; while((bb=bReader.readLine())!=null) { s=s+bb; } String [] data=s.split(" "); int [] datas=new int [data.length]; //将String类型数组转成int类型 for(int j=0;j<data.length;j++) { datas[j]=Integer.parseInt(data[j]); } for(int i=0;i<datas.length;i++) { System.out.print(datas[i]+" "); } int[] num=new int[50]; num[0]=datas[0]; int number=0; for(int i=1;i<datas.length;i++) { if(datas[i]+datas[i-1]>datas[i]) { num[i]=datas[i]+num[i-1]; number=number+1; } else { num[i]=datas[i]; } } int max=num[0]; for(int i=1;i<datas.length;i++) { System.out.print(num[i]+" "); if(num[i]>max) max=num[i]; } System.out.print(max+" "); System.out.print(number); } }