Given an array containing n distinct numbers taken from 0, 1, 2, …, n, find the one that is missing from the array.
For example:
Given nums = [0, 1, 3] return 2.
Note:
Your algorithm should run in linear runtime complexity.
Could you implement it using only constant extra space complexity?
題目:
假設有一個數組,包含n個不同的數,這n個數從0, 1, 2, …, n中選取,找到其中缺失的一個數。
分析:
最簡單的做法是:
將原來的n+1個數相加,再遍歷數組將n個數相加,
最後將兩個相加得到的和相減,即爲所求。
但是,這裏存在一個問題,即累加這些數可能會出現溢出的情況,
考慮到這種可能,可以換一種考慮方式,
在遍歷數組時,將result值一邊加上數組的索引值(其實指的是0,1,2,..,n),一邊減去其對應的數值,
因爲遍歷數組的索引值只到n-1,
所以,在遍歷結束後,需要將result加上n,其得到的結果爲所求。
/**
* @param {number[]} nums
* @return {number} result
*/
var missingNumber = function(nums) {
var result = 0;
for (var i=0; i<nums.length; i++) {
result += i;
result -= nums[i];
}
result += i;
return result;
};
另一種解法,採用位操作的方法。
原始數組是0,..,n,抽取之後的新數組相比原始數組而言,少了一個元素,
所以,將兩個數組組合在一起,只有一個的就是缺失的那個元素,
那麼,我們將兩個數組中的所有數進行異或操作(相同爲0,不同爲1),
最後得到的結果即爲所求。
var missingNumber = function(nums) {
var result = 0;
for (var i=0; i<nums.length; i++) {
result ^= nums[i];
}
for (var j=0; j<=nums.length; j++) {
result ^= j;
}
return result;
};