軟件工程第三次做業--最大連續子數組和(最大子段和)測試

最大連續子數組和(最大子段和)測試

問題: 給定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

程序設計

程序設計思路

爲了求數組最大字段和,須定義變量max,currentSum分別保存最大值和當前和。初值均設爲零,對currentSum進行循環加法,當currentSum<=0時,將currentSum值重置爲num[i],不然currentSum=currentSum+num[i]。將max與currentSum進行比較,若後者大則max賦值爲currentSum,不然不變。最終結果即爲最大字段和。git

程序代碼

coding連接:https://coding.net/u/INeedAPassport/p/JunitTest_2/git?public=true數組

package code;
import java.util.Scanner;

public class maxNU {
	public  void main(String[] args) {
		Scanner inport=new Scanner(System.in);
		int i,n;
		int[] num=new int[100];
		n=inport.nextInt();
		for(i=0;i<n;i++)
			num[i]=inport.nextInt();
		int result = sum(num);
        System.out.println("連續子元素的最大和爲:"+result);
		inport.close();
	}
		public int sum(int[] num) {
			if (num.length==0 || num==null) {
				return 0;
			}
			int currentSum = 0;     
			int max = 0;           
			for (int i = 0; i <num.length; i++) {
				if(currentSum<=0){     
					currentSum = num[i];     
				}else{
					currentSum = currentSum + num[i];   
				}
				if(currentSum>max){         
					max = currentSum;      
				}
			}
			return max;
		} 
}

測試程序

斷定/條件覆蓋測試程序設計

由圖知測試程序須要涵蓋如下狀況:測試

數組num爲空 currentSum<=0 currentSum>max
數組num不爲空 currentSum>0 currentSum>max

測試程序代碼

package code;

import static org.junit.Assert.*;

import org.junit.Test;


public class test {

	@Test
	public void sum1() {
		assertEquals(0, new maxNU().sum(new int[] {} ));
	}
	@Test
	public void sum2() {
		assertEquals(20,new maxNU().sum(new int[] {-2,11,-4,13,-5,-2} ));
	}
	@Test
	public void sum3() {
		assertEquals(0, new maxNU().sum(new int[] {-2,-11,-4,-13,-5,-2} ));
	}
	@Test
	public void sum4() {
		assertEquals(12, new maxNU().sum(new int[] {1,4,7} ));
	}

測試結果

相關文章
相關標籤/搜索