算法題1


摘自傳智播客公開課


package test;
/*
 * 傳智播客公開課筆記
 */
public class Arithmetic {
    public static void main(String[] args) {
        /*
        題設:現有0到99,共計100個整數,各不相同,將所有數放入一個
            數組,隨機排布。數組長度101,多餘的數字是0到99其中任
            意一個數(唯一重複的數字)
        問題:將這個重複的數字找出來
        */
        /*
         * 構造題目
         */
        int[] num = new int[101];
        for(int i=0;i<num.length;i++) {
            num[i] = i;
        }
        num[100] = 55;
        for(int i=0;i<10000;i++) {
            int num1 = (int)(Math.random()*101);
            int num2 = (int)(Math.random()*101);
            int temp;
            temp = num[num1];
            num[num1] = num[num2];
            num[num2] = temp;
        }
           
           
        //題目測試
        for(int i = 0;i<num.length;i++) {
            System.out.print(num[i] + "\t");
            if((i+1)%10==0)
                System.out.println();
        }
           
        //問題解決
        /*
         * 方案一
         */
        feng:
        for(int i = 0;i<num.length;i++) {
            for(int j = i+1;j<num.length;j++) {
                if(num[j]==num[i]) {
                    System.out.println("\n" + "方案一找出來的數字爲:" + num[i]);
                    break feng;
                }
            }
        }
        //缺點:隨着基數的增大,計算次數可能會成倍增大
           
        /*
         * 方案二
         */
        int sum = 0;
        for(int i=0;i<num.length;i++) {
            sum += num[i];
        }
        for(int i=0;i<100;i++) {
            sum -= i;
        }
        System.out.println("\n" + "方案二找出來的數字爲:" + sum);
        //缺點:如果計算的數字特別多,比如有3萬億個數據,超出了數據類型
           
        /*
         * 方案三
         */
        int test = num[0];
        for(int i=1;i<num.length;i++) {
            test = test^num[i];
        }
        for(int i=0;i<100;i++) {
            test = test^i;
        }
        System.out.println("\n" + "方案三找出來的數字爲:" + test);
           
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章