-、實驗題目:
n傳回一個整數數組中最大子數組的和。
二、實驗要求:
n要求程式必須能處理1000 個元素;
n每個元素是int32 類型的;
n輸入一個整形數組,數組裡有正數也有負數。
n數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。
n求所有子數組的和的最大值。要求時間複雜度為O(n)。
三、源代碼:
import java.util.Random;
public class max {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=1000;
int C[]=new int[n];
int D[]=new int[n];
int a=0;
int MAX=0;
int b=0;
long MAX1=0;
long b1=0;
double MAX2=0;
double b2=0;
int MAX3=0;
int b3=0;
int m1=2147483600;
int m2=2147483647;
Random rand=new Random();
//随機産生數組C[N]
for(int i=0;i<n;i++)
{
a=rand.nextInt(2);
if(a==0)
{
C[i]=(int) (m1+Math.random()*( m2-m1+1));
}
else
{
C[i]=-(int) (m1+Math.random()*(m2-m1+1));
}
}
//随機産生數組D[N]
for(int i=0;i<n;i++)
{
a=rand.nextInt(2);
if(a==0)
{
D[i]=(int) (Math.random()*(100));
}
else
{
D[i]=-(int) (Math.random()*(100));
}
}
//計算int32 型溢出時的結果
b=C[0];
MAX=b;
for(int i=1;i<n;i++)
{
if(b<0)
{
b=C[i];
if(MAX<b)
{
MAX=b;
}
}
else
{
if(C[i]<=0)
{
if(MAX<b)
{
MAX=b;
}
b=b+C[i];
}
else
{
b=b+C[i];
if(MAX<b)
{
MAX=b;
}
}
}
}
//通過轉化成double型計算
b2=C[0];
MAX2=b2;
for(int i=1;i<n;i++)
{
if(b2<0)
{
b2=C[i];
if(MAX2<b2)
{
MAX2=b2;
}
}
else
{
if(C[i]<=0)
{
if(MAX2<b2)
{
MAX2=b2;
}
b2=b2+C[i];
}
else
{
b2=b2+C[i];
if(MAX2<b2)
{
MAX2=b2;
}
}
}
}
//通過轉化成long型計算
b1=Long.valueOf(C[0]);
MAX1=b1;
for(int i=1;i<n;i++)
{
if(b1<0)
{
b1=Long.valueOf(C[i]);
if(MAX1<b1)
{
MAX1=b1;
}
}
else
{
if(C[i]<=0)
{
if(MAX1<b1)
{
MAX1=b1;
}
b1=b1+Long.valueOf(C[i]);
}
else
{
b1=b1+Long.valueOf(C[i]);
if(MAX1<b1)
{
MAX1=b1;
}
}
}
}
//普通的程式處理1000個元素的結果
b3=D[0];
MAX3=b3;
for(int i=1;i<n;i++)
{
if(b3<0)
{
b3=D[i];
if(MAX3<b3)
{
MAX3=b3;
}
}
else
{
if(D[i]<=0)
{
if(MAX3<b3)
{
MAX3=b3;
}
b3=b3+D[i];
}
else
{
b3=b3+D[i];
if(MAX3<b3)
{
MAX3=b3;
}
}
}
}
System.out.println("測試int31型 數組為:");
for(int i=0;i<n;i++)
{
System.out.print(C[i]+" ");
if((i+1)%100==0)
{
System.out.println();
}
}
System.out.println("測試程式處理1000個元素 的數組為:");
for(int i=0;i<n;i++)
{
System.out.print(D[i]+" ");
if((i+1)%100==0)
{
System.out.println();
}
}
System.out.println();
System.out.println("數組元素為1000個,100以内随機取數:");
System.out.println("最大數組和為:"+MAX3);
System.out.println();
System.out.println("int32 類型溢出測試:");
System.out.println("溢出顯示的結果,最大數組和為:"+MAX);
System.out.println("解決以後的結果,最大數組和為:(1)求最大子數組和時用double型:"+MAX2);
System.out.println(" (2)求最大子數組和時用long型:"+MAX1);
}
}
四、程式運作截圖:

五、出現的問題及解決方案
問題:所得結果超過int32的最大範圍時,結果顯示int32型的最大值。
解決方法:在進行數組加法時,轉換為double型或long型計算。
六、總結
在測試數組能測試的最大元素個數方面沒有完成,在測試數組元素為5000000時,程式運作了40多分鐘都沒有出現結果。
這次結對開發,自己最大的收獲是要學會與同伴交流,學會聽取他人意見,在意見不符時,要調整好心态。
七、隊友