《软件工程》个人作业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);
    }

 

 

 

结果截图:

方案一:

方案二:

 

posted @ 2020-02-28 09:54  Mr_WildFire  阅读(184)  评论(0编辑  收藏  举报