給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。
示例 1:
輸入: [3,0,1]
輸出: 2
示例 2:
輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8
下面我用兩種方法,一塊瞭解一下。
求合法
// 開始之前我先說一下我的思路
//0-n個有序數字累加和,數學裏邊是有公式的,我們重溫一下推導過程。
// 0, 1 n爲1 個數爲2, 累加和爲1
// 0, 1, 2 n爲2 個數爲3,累加和爲3
// 0, 1, 2, 3 n爲3 個數爲4,累加和爲6
// 0, 1, 2, 3 ,4 n爲4 個數爲5, 累加和爲10
// 思考一下,n已知所以我們從n上找規律
//以上我們推出 (n*個數)/2 = 累加和,是不是這個理?
// n知道 累加和知道,少那個我們不就知道了嗎?
// 完整的n序列和-缺失數字的累加和=缺失數字
// 翻譯成代碼
var arr = [0, 1, 3]
function findNum(nums) {
let len = nums.length
let n = len * (len + 1) / 2
let n1 = nums.reduce((num, item) => {
return num + item
}, 0)
console.log(n, n1)
return n - n1
};
console.log(findNum(arr))//2
索引查找法
//先解析思路,0-n序列,數組的索引和0-n序列正好能一一對應,不過因爲有可能是亂序,所以不能直接挨個匹配索引對比,我們需要換個思路。
//因爲是序列,雖然亂序,只是和遍歷n的索引值缺一個,這就簡單了,我們通過遍歷n來查找對應的剩餘數組,找不到的就是我們要找的缺失數字,怎麼找對應數字呢?你猜對了我們用indexOf()
function findNum1(nums) {
let len = nums.length + 1
for (let i = 0; i < len; i++) {
if (nums.indexOf(i) === -1) {
return i
}
}
};
findNum1(arr)
完美,只不過沒有第一種的效率高!畢竟每一次indexOf也是一次遍歷過程。