题目描述

题目:最大连续子数组和

问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。——来自百度百科

  很快我们迎来了软件工程的第三次作业,随着时间的推移,作业的难度也在逐渐加大。这次要利用Java语言编程,对于我而言,虽然上个学期选修了Andriod移动应用开发,但是不得不说我是为了蹭学分的,所以并没有什么收获,除了电脑里留下的Eclipse和AndriodStudio。所以这次的编程对于我来说就是一次小小的挑战。

  借鉴了同学的思路,也看了作业中提供的方法,写出了这段代码。我的整体思路是设定两个变量p和sum,用于比较和记录当前最大连续子数组的和。在开始将两个变量均初始化为0,进而进行相加、比较的过程。我认为在开始时可以直接跳过负数,因为算上了负数一定不会得出最大的子数组和,然后再设定一个循环就可以轻松得出最大子数组的和。我编写的代码截图如下图。

GitHub Mark

代码测试

  在本题中我选择判定/条件覆盖。下图为测试的代码。
GitHub Mark

  通过上节课的学习我已经可以很好的运用Junit来测试了。下图说明测试通过了。
GitHub Mark

心得体会

  可以说这门课程的这种新颖的完成作业的方式让我学会了运用很多的工具,不仅仅是学会了Java语言,更是提高了自己的自学能力,而且每次作业都会让我觉得可以巩固上一次作业的内容。第三次作业就让我学会了使用Markdown编辑器、学会了使用Junit测试,更重要的是让我有了解决问题的信心与恒心,当然,在写出自己的第一个Java代码的时候,让我重新体验到了大一那年自己写出C语言代码的喜悦。这种体验弥足珍贵,而在写代码过程中的那些挫败与不断重来的勇气也是令我印象深刻的。