題目
在一個長度為n的數組里的所有數字都在0到n-1的范圍內。 數組中某些數字是重復的,但不知道有幾個數字是重復的。也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。 例如,如果輸入長度為7的數組{2,3,1,0,2,5,3},那么對應的輸出是第一個重復的數字2。
思路
利用對象或者散列表或者下標檢測
// 推薦解法
function duplicate(numbers, duplication)
{
// write code here
//這里要特別注意~找到任意重復的一個值並賦值到duplication[0]
//函數返回True/False
let hash = []
for (let i = 0; i < numbers.length; i++) {
if (!hash[numbers[i]]) {
hash[numbers[i]] = 1
} else {
if (++hash[numbers[i]] === 2) {
duplication[0] = numbers[i]
return true
}
}
}
return false
}
// 解法1:下標檢測
function duplicate(numbers, duplication)
{
// write code here
//這里要特別注意~找到任意重復的一個值並賦值到duplication[0]
//函數返回True/False
let obj = {}
for(let i = 0; i < numbers.length; i++) {
if(numbers.indexOf(numbers[i]) !== i) {
duplication[0] = numbers[i]
return true
}
}
return false
}
// 解法2:對象特性
function duplicate(numbers, duplication)
{
// write code here
//這里要特別注意~找到任意重復的一個值並賦值到duplication[0]
//函數返回True/False
let obj = {}
for (let i = 0; i < numbers.length; i++) {
if (!obj[numbers[i]]) {
obj[numbers[i]] = true
} else {
duplication[0] = numbers[i]
return true
}
}
return false
}
// 解法3:哈希散列法,其實原理和obj差不多
function duplicate(numbers, duplication)
{
// write code here
//這里要特別注意~找到任意重復的一個值並賦值到duplication[0]
//函數返回True/False
let hash = []
for (let i = 0; i < numbers.length; i++) {
if (!hash[numbers[i]]) {
hash[numbers[i]] = 1
} else {
if (++hash[numbers[i]] === 2) {
duplication[0] = numbers[i]
return true
}
}
}
return false
}