《软件工程》个人作业1----数组(返回一个整数数组中最大子数组的和)
个人作业1----数组
题型一:普通的整型数组
目标:
返回一个整型数组中最大子数组的和。
题目要求:
1.输入一个整型数组,数组中有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,数组都有一个和。
3.求所有子数组和的最大值。要求时间复杂度为O(n)。
问题分析:
1.输入
2.数组:整型 有正 有负
3.子数组
4.子数组和
5.所有 子数组和 其中 的最大值
6.时间复杂度为O(n)
源代码:
import java.util.*; public class Array1 { public static void main(String args[]) { int []arr1; arr1=new int [100]; int n; int sum; Scanner sc=new Scanner(System.in); System.out.println("请输入您想要输入的个数:"); n=sc.nextInt(); for(int i=0;i<n;i++) { arr1[i]=sc.nextInt(); } for(int i=1;i<n;i++) { if(arr1[i-1]+arr1[i]>arr1[i]) { arr1[i]=arr1[i-1]+arr1[i]; } } sum=-1000000; for(int i=0;i<n;i++) { if(sum<arr1[i]) { sum=arr1[i]; } } System.out.print("整数数组所有最大子数组的和为:"); System.out.println(sum); } }
结果截图:
题型二:环装数组
目标:
返回一个整型数组中最大子数组的和。
题目要求:
数组更改为环型数组,其它条件不变。
问题分析:
1.数组:环形数组。
2.运算时并不是只有最后原线性数组的最后一个arr1[n-1]需要和循环一圈的第一个arr1[0]运算,而是,每一个arr1[i]都有机会和循环一圈的数组第一个arr1[0]运算的机会与权利。也就是说每一次都要考虑到能运算到下一次循坏开始的情况。
源代码:
解决方案一:(此方案比较投机取巧,但是却能很小的改动确实的解决问题)
改动1:将用户想要输入的个数在系统内部直接加一
n=sc.nextInt();
n=n+1;
改动2.:让用户输入环形数组,并强制要求正确格式。
System.out.println("请输入环状数组(需要写出环状数组的第一个元素和循环之后第一个元素):"); for(int i=0;i<n;i++) { arr1[i]=sc.nextInt(); } if(arr1[0]!=arr1[n-1]) { System.out.println("格式错误,请重现输入"); }
if(arr1.length<n) {
System.out.println("格式错误,请重现输入");
}
源代码:
import java.util.Scanner; public class Array2 { public static void main(String args[]) { int []arr1; arr1=new int [100]; int n; int sum; Scanner sc=new Scanner(System.in); System.out.println("请输入您想要输入的个数:"); n=sc.nextInt(); n=n+1; System.out.println("请输入环状数组(需要写出环状数组的第一个元素和循环之后第一个元素):"); for(int i=0;i<n;i++) { arr1[i]=sc.nextInt(); } if(arr1[0]!=arr1[n-1]) { System.out.println("格式错误,请重现输入"); } if(arr1.length<n) { System.out.println("格式错误,请重现输入"); } for(int i=1;i<n;i++) { if(arr1[i-1]+arr1[i]>arr1[i]) { arr1[i]=arr1[i-1]+arr1[i]; } } for(int i=0;i<n;i++) { System.out.println(arr1[i]); } sum=-1000000; for(int i=0;i<n;i++) { if(sum<arr1[i]) { sum=arr1[i]; } } System.out.print("整数数组所有最大子数组的和为:"); System.out.println(sum); } }
缺陷:如果输入错误,并不能再次重新输入。
解决方案2:
用另一个比用户输入数组多一的数组来盛放原来的数组,第二个数组的最后一位盛放原数组的第一位。
源代码:
import java.util.Scanner; public class Array2_2 { public static void main(String args[]) { int []arr1,arr2; arr1=new int [100]; arr2=new int [100]; int n; int sum; Scanner sc=new Scanner(System.in); System.out.println("请输入您想要输入的个数:"); n=sc.nextInt(); for(int i=0;i<n;i++) { arr2[i]=sc.nextInt(); } for(int i=0;i<n;i++) { arr1[i]=arr2[i]; } arr1[n]=arr2[0]; for(int i=1;i<=n;i++) { if(arr1[i-1]+arr1[i]>arr1[i]) { arr1[i]=arr1[i-1]+arr1[i]; } } for(int i=0;i<=n;i++) { System.out.println(arr1[i]); } sum=-1000000; for(int i=0;i<=n;i++) { if(sum<arr1[i]) { sum=arr1[i]; } } System.out.print("整数数组所有最大子数组的和为:"); System.out.println(sum); }
结果截图:
方案一:
方案二: