1. 程式人生 > 其它 >劍指offer_03_陣列中重複的數字(Java)

劍指offer_03_陣列中重複的數字(Java)

題目

找出陣列中重複的數字。
在一個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意一個重複的數字。

示例 1:
輸入:

[2, 3, 1, 0, 2, 5, 3]

輸出:

2 或 3

限制:

2 <= n <= 100000

解答

Hash表

   public static int findRepeatNumber(int[] nums) {
        // 1. 規定了陣列長度大於2,不需要判空處理
        int len = nums.length;
        // 2. 定義一個HashMap 用key儲存陣列元素、值統計次數
        Map dict = new HashMap();
        // 3. 遍歷陣列,如果在dict中沒有元素則put到map,如果該元素已存在,則返回對應的元素。
        for(int i = 0; i < len; i++){
            if(!dict.containsKey(nums[i])){
                dict.put(nums[i],1);
            }else{
                return nums[i];
            }
        }
        return 0;
    }

找規律

    public static int findRepeatNumber2(int[] nums) {
         // 1. 遍歷陣列,如果陣列
        for(int i = 0; i < nums.length; i++){
            // 2. 如果nums[i] != i,則交換 nums[i] 和 nums[nums[i]]
            while(nums[i] != i){
                // 3. 如果nums[i] 和 nums[nums[i]]相等,則表示陣列中出現了重複數字
                if(nums[i] == nums[nums[i]])
                    return nums[i];
                int temp = nums[i];
                nums[i] = nums[temp];
                nums[temp] = temp;
            }
        }
        return 0;
    }