JS實現 LeetCode 陣列類演算法(三)
阿新 • • 發佈:2019-02-09
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;
};