給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出如今序列中的那個數。數組
示例 1:翻譯
輸入: [3,0,1]
輸出: 2
示例 2:code
輸入: [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也是一次遍歷過程。it