题目:
设计思想:
先输入数组的长度n,创建一个2n-1长的数组(循环数组,循环前n-1个数),输入数字并同步到后面循环的数。最大子数组只能以正数开头结尾,查找前n个数中的正数,以其为开头,n为长度的数组中找最大子数组;若无正数找出最大的负数。设置开头和长度作为子数组输出的标准,并在得出较大子数组时修改数据;最后输出最大子数组。
出现的问题:
全负数时,长度设为1时,只对第一个最大有效。后改为0。
可能的解决方案(多选):
找出所有正数,以其为头尾得出最大子数组;全负数时找最大负数。
源代码:
package shuzu; import java.util.Scanner; public class max { public static void main(String[] args) { System.out.println("请输入数组长度:"); Scanner s = new Scanner(System.in); int n = s.nextInt();//数组长度 int [] a = new int [2 * n - 1];//循环数组转化为普通数组 System.out.println("请输入数组:"); for(int i = 0;i < n;i++) { a[i] = s.nextInt(); if(i < n - 1) a[i + n] = a[i];//重复前n-1个 } int max = a[0], begin = 0, length = 0; //求最大子数组 for(int i = 0;i < n;i++) { if(a[i] > 0)//最大子数组头尾为正数 { int m = 0; for(int j = 0;j < n;j++)//加后面n-1个数之内,查看最大子数组 { m += a[j + i]; if(m > max) { begin = i; length = j; max = m; } } } else//全为负数,找出最大负数 { if(a[i] > max) { begin = i; length = 0; max = a[i]; } } } System.out.println("数组最大子数组:"); for(int i = begin;i <= begin + length;i++) System.out.print(a[i] + " "); s.close(); } }
结果截图:
总结:
1.在书写代码时需要有详细的计划,这样做起来会很省力。
2.双人讨论能促进思想的碰撞,得出更好的idea。
3.测试时要实验各种数据,得出软件的不足之处,进行修改。