【LeetCode】268. Missing Number

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;
};
發佈了71 篇原創文章 · 獲贊 14 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章