1. 程式人生 > >JS實現 LeetCode 陣列類演算法(三)

JS實現 LeetCode 陣列類演算法(三)

268. 缺失數字

  • 給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。

分析:將陣列進行升序排序,沒有缺失的陣列元素應該與其下標相等,故排序後遍歷陣列,將陣列下標與元素進行比較,若不相等,則陣列下標即為該陣列缺失的元素。若陣列所有的元素都與其下標相等,則陣列缺失的為陣列最後一個元素的下一個數字,即nums.length或nums[nums.length - 1] + 1。程式碼如下:

var missingNumber = function(nums) {
    nums.sort((a,b)=>{return a - b;});
    for (let i = 0, len = nums.length; i < len; i++) {
        if (i != nums[i]) {
            return i;
        }
    }
    return nums[nums.length - 1] + 1;
};

其他實現:

var missingNumber = function(nums) {
    let missing = nums.length;
    for(let i = 0; i < nums.length; i++) {
        missing ^= i ^ nums[i]
    }
    return missing;
};

283. 移動零

  • 給定一個數組nums,編寫一個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。
  • 說明:
  • 必須在原陣列上操作,不能拷貝額外的陣列。
  • 儘量減少操作次數。

分析:將所有非零元素按照其順序在原陣列中從左依次排序,排完非零元素後  剩餘陣列長度的元素都置零。程式碼如下:

var moveZeroes = function(nums) {
    let count = 0;
    nums.forEach(function (val,index,arr) {
        if (val != 0) {
            arr[count] = val;
            count++;
        }
    });
    while (count < nums.length) {
        nums[count] = 0;
        count++;
    }
};

其他實現:

var moveZeroes = function(nums) {
    for(var i = nums.length - 1;i > -1;i--){
    	if(nums[i] == 0){
    		nums.splice(i,1)
    		nums.push(0)
    	}
    }
};

414. 第三大的數

  • 給定一個非空陣列,返回此陣列中第三大的數。如果不存在,則返回陣列中最大的數。要求演算法時間複雜度必須是O(n)。

分析:將陣列按降序排序去重後,判斷陣列長度如果小於三則返回陣列的第一個元素即最大元素,若陣列長度大於等於三,則返回陣列的第三個元素,即為陣列中第三大的數。程式碼如下:

var thirdMax = function(nums) {
    nums.sort(function (a,b) {
      return b - a;
    });
    nums = [...new Set(nums)]; // Set型別不能訪問使用[]或.訪問其中的某一元素 所以此時應該使用 拓展字串將其轉換回陣列 相較更方便操作一些
    let len = nums.length;
    return len < 3 ? nums[0] : nums[2];
};

448. 找到所有陣列中消失的數字

  • 給定一個範圍在  1 ≤ a[i] ≤ n ( n = 陣列大小 ) 的整型陣列,陣列中的元素一些出現了兩次,另一些只出現一次。
  • 找到所有在 [1, n] 範圍之間沒有出現在陣列中的數字。
  • 您能在不使用額外空間且時間複雜度為O(n)的情況下完成這個任務嗎? 你可以假定返回的陣列不算在額外空間內。

程式碼如下:

var findDisappearedNumbers = function(nums) {
    let len = nums.length, disNums = [], count = 1, i = 0;
    nums = [...new Set(nums)]; // 陣列去重
    nums.sort((a,b) => {return a - b;});  // 陣列升序排序
    while (i < nums.length) {  // 當陣列中的元素與count元素相等時才接著往下遍歷陣列,否則就將count存進返回的結果陣列中
        if (nums[i] != count) {
            disNums.push(count);
        } else {
            i++;
        }
        count++;
    }
    while(disNums.length < len - nums.length) {  // 當缺失的是末尾的數字時,通過幾個數組長度的比較,判斷是否需往結果陣列中新增元素
        disNums.push(count);
        count++;
    }
    return disNums;
};

其他實現:

var findDisappearedNumbers = function(nums) {
    var res = [],
    length = nums.length;
    
    for(var i = 0; i < length;i++){
        var m = Math.abs(nums[i]) - 1; //這裡須取絕對值,因為在之前的操作中這裡可能已經被置為負值,這裡判斷需要按照原值進行。
        nums[m] = nums[m] > 0 ? -nums[m] : nums[m];
    }
    for(var j = 0;j < length;j++){
        if(nums[j] >= 0) res.push(j + 1);
    }
    return res
};

485. 最大連續1的個數

  • 給定一個二進位制陣列, 計算其中最大連續1的個數。
  • 注意:
  • 輸入的陣列只包含 0 和1。
  • 輸入陣列的長度是正整數,且不超過 10,000。

分析:遍歷陣列,將陣列中多段連續1的個數存放在一個數組中,最後陣列中元素的最大值即為最大連續1的個數。daimaruxia

var findMaxConsecutiveOnes = function(nums) {
    let conArr = [], count = 0;
    nums.forEach((val,index,arr) => {
        if (val == 1) {
            count++;
        } else {
            conArr.push(count);
            count = 0;
        }
    });
    conArr.push(count);
    return Math.max(...conArr);
};

其他實現:

var findMaxConsecutiveOnes = function(nums) {
    let max = 0;
    let cur = 0;
    nums.map(function (num) {
        if(num == 1){
            cur++;
            max = cur > max ? cur : max;
        }
        else{
            cur = 0;
        }
    });
    return max;
};