【劍指offer中等部分20】陣列中重複的數字(java)
阿新 • • 發佈:2020-12-29
一、題目描述
在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中第一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。
返回描述:
如果陣列中有重複的數字,函式返回true,否則返回false。
如果陣列中有重複的數字,把重複的數字放到引數duplication[0]中。(ps:duplication已經初始化,可以直接賦值使用。)
二、分析
2.1 方法一
分析:第一為常規解法,我們可以用一個boolean陣列
實現程式碼如下:
public class Solution {
public boolean duplicate(int numbers[], int length, int [] duplication) {
if (numbers == null || length <= 1) {
return false;
}
// 長度為n的布林陣列用於判斷數字是否存在
boolean[] arr = new boolean[length];
for (int i = 0 ; i < length ; i++) {
int val = numbers[i];
// 判斷重複數字
if (arr[val] == true) {
duplication[ 0] = val;
return true;
}
arr[val] = true;
}
return false;
}
}
2.2 方法二
分析:第二個方法是用java中的HashMap,HashMap由key值,values值兩部分組成,最重要的是map.containsKey(numbers[i])這個方法,作用是判斷對應值是否已經存在於map集合中,若未存在,則用map.put放進去,並且values值賦值為1,表示目前已經出現一次,若已經存在,則為第一次重複,我們就將重複值賦給duplication[0],並返回true。
實現程式碼如下:
import java.util.Map;
import java.util.HashMap;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers == null || numbers.length <= 1)
return false;
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
boolean flag = false;
for(int i=0 ; i<length ; i++){
if(!map.containsKey(numbers[i])){
map.put(numbers[i], 1);
}else{
duplication[0] = numbers[i];
flag = true;
break;
}
}
return flag;
}
}