1. 程式人生 > >幾個經典程式設計題(二)

幾個經典程式設計題(二)

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");
        }
         
    }
 
}