劍指offer_03_陣列中重複的數字(Java)
阿新 • • 發佈:2021-07-01
題目
找出陣列中重複的數字。
在一個長度為 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; }