幾個經典程式設計題(二)
1:有兩個有序整數集合a和b,寫一個函式找出它們的交集?
import java.util.ArrayList;
public class Test {
public static void main(String args[]) throws Exception {
int[] a = {2, 3, 4, 4, 4, 4, 7, 8, 8, 8, 8, 9, 100, 130, 150, 160};
int[] b = {4, 6, 7, 7, 7, 7, 8, 8, 9, 10, 100, 130, 130, 140, 150};
int i=0,j=0;
ArrayList al=new ArrayList();
while(i<a.length&&(j<b.length)){
if(a[i]<b[j])
i++;
else if(a[i]>b[j])
j++;
else{
i++;j++;
al.add(a[i]);
}
}
System.out.println(al);
}
} //由兩個序列的第一個開始判斷,因為有序,所以a<b時判斷a的下一個,反之判斷b的下一個。如果相等就是交集部分,進行新增。
2:給定一個數組,當中有正負數,求當中的一段“子陣列”(即任意長度,連續的數字),使得這個“子陣列”的和是所有“子陣列”和中最大的,
如給定的陣列為12, -8, 5, 66, -21, 0 ,35, -44,7,則最大的和的子陣列為{12, -8, 5, 66, -21, 0 ,35},最大的和為89.
可以直接求解:
public
class Test {
public static void main(String args[]) throws Exception {
int a[]= {12,-8,5,66,-21,0,35,-44,7};
int n=a.length;
int max =0;
int i, j, sum;
for(i = 0; i < n; i++)
{
sum = 0;
for(j = i; j < n; j++)
{
sum += a[j];
if(sum > max )
max = sum;
}
}
int result=0;
int m=0;
for (int k=0;k<n;k++) {
result=result+a[k];
if (result==max) {
m=k;
}
}
for (int p=0;p<=m;p++) {
System.out.print(a[p]+" ");
}
System.out.println("\n"+max);
}
} //直接相加找出最大序列和,然後標記下此時的下標求出最大和的序列
3:一個數組,“支配者”是在陣列中出現頻率超過一半的整數,
例如[3,4,3,2,-1,3,3,3]數值“3”出現過5次,5除以8大於0.5
所以數值“3”是一個支配者;
而在這個陣列中的支配者出現在陣列下標[0,2,4,6,7]
寫一個函式,在給定的整數陣列中找出支配者所在的任意一個數組下標,如果一個數組中沒有支配者返回-1;
import
java.util.LinkedList;
public class Test
{
public static void main(String[] args)
{
int []num={3,4,3,2,-1,3,3,3};
LinkedList ll=new LinkedList();
float temp;
int n=0;
for(int i=0;i<num.length-1;i++)
{
for(int j=i+1;j<num.length;j++)
{
if(num[i]==num[j])
{
ll.add(new Integer(num[j]));
//將陣列中與a[i]相同的值新增到列表中,a[i]未包含,所以最終的個數要+1
}
}
temp=ll.size()+1; //求陣列中相同值的個數,並轉換為float型,方便下面的除法運算
ll.clear(); //清空列表,保證只有出現支配者的時候才輸出的值沒有之前的
if(temp/num.length>0.5) //判斷是否為支配者
{
System.out.println("該陣列中的支配者為:"+num[i]+",下標為:");
for(int m=i;m<num.length;m++) //找到該支配者的下標
{
if(num[i]==num[m])
System.out.println(m);
}
n++; //判斷支配者的個數,如果最終為0,則沒有支配者
}
}
if(n==0)
{
System.out.println("-1");
}
}
}