[英]How to move all elements that are zero to the end of an array?
編寫一個 function,它接受一個值數組並將所有為零的元素移動到數組的末尾,否則保留數組的順序。 零元素還必須保持它們出現的順序。
零元素由 0 或“0”定義。 一些測試可能包含非數字文字的元素。
不允許使用任何臨時 arrays 或對象。 也不允許使用任何 Array.prototype 或 Object.prototype 方法。因此不允許使用 array.push 或 splice()。
我試過這個:
function removeZeros(nums) {
for(let i = nums.length - 1; i >= 0 ; i--){
if(nums[i] === 0){
nums.splice(i, 1);
nums.push(0);
}
}
return nums;
}
[7, 2, 3, 0, 4, 6, 0, 0, 13, 0, 78, 0, 0, 19, 14]
[7, 2, 3, 4, 6, 13, 78, 19, 14, 0, 0, 0, 0, 0, 0]
[7, 2, 3, 4, 6, 13, 78, 19, 14, 0, 0, 0, 0, 0, 0]
結果是正確的,但我需要在沒有 array.push() 或 array.splice() 的情況下進行
function removeZeros(nums) { let originalLen = nums.length let nonZero = nums.filter(Boolean) return [...nonZero,...new Array(originalLen-nonZero.length).fill(0)] } console.log(removeZeros([7, 2, 3, 0, 4, 6, 0, 0, 13, 0, 78, 0, 0, 19, 14]))
也不允許使用任何Array.prototype或Object.prototype方法
function removeZeros(nums) { let originalLen = nums.length let final = [] for(let i=0;i<nums.length; i++){ if(nums[i]) final = [...final, nums[i]] } let lenDiff = originalLen-final.length while(lenDiff){ final = [...final,0] lenDiff-- } return final } console.log(removeZeros([7, 2, 3, 0, 4, 6, 0, 0, 13, 0, 78, 0, 0, 19, 14]))
使用for循環,遍歷數組,並使用簡單的條件檢查零。
var arr = [7, 2, 3, 0, 4, 6, 0, 0, 13, 0, 78, 0, 0, 19, 14];
var prev_zero_index = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] != 0 && arr[i - 1] == 0) {
prev_zero_index++;
arr[prev_zero_index] = arr[i];
arr[i] = 0;
}
}
您可以使用sort
:
const arr = [7, 2, 3, 0, 4, 6, 0, 0, 13, 0, 78, 0, 0, 19, 14] arr.sort((a, b) => (a === 0) - (b === 0)) console.log(arr)
減去布爾值將返回1,-1或0。
true - false === 1
false - true === -1
true - true === 0
如果a
為0而b
不是,則返回1並將a
移到數組的末尾。 如果a
和b
均為零或非零,則它們不會相對移動。
function pushZeros(arr) {
let count = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== 0) arr[count++] = arr[i];
}
while (count < arr.length) arr[count++] = 0;
return arr;
}
基本上,我循環遍歷數組的所有元素,在循環時選擇非零元素,並將其從第0個位置存儲在同一數組中。 完成循環后,count將等於數組中的總非零元素。 然后可以將所有剩余部分初始化為零。
您可以簡單地執行以下操作:
let data = [7, 2, 3, 0, 4, 6, 0, 0, 13, 0, 78, 0, 0, 19, 14] let result = data.sort((a,b) => !!b-!!a) console.log(result)
您將在其中對每個數組條目的布爾值進行排序的位置。 我們通過雙重否定運算符將其轉換為布爾值。 由於!!0
為假,其他所有數字均為真,並且我們以降序排序(因此ba
而不是ab
),我們得到了所需的結果。
請注意, Array.sort
改變當前數組,如果要創建一個新數組,只需使用Array.slice
如下所示:
let data = [7, 2, 3, 0, 4, 6, 0, 0, 13, 0, 78, 0, 0, 19, 14] let sortZeroesLast = arr => arr.slice().sort((a,b) => !!b-!!a) console.log(data) // <-- original array console.log(sortZeroesLast(data)) // <-- new sorted array
您可以使用sort()
根據與0
的相等性對列表進行排序,就像這樣!
let numbers = [7, 2, 3, 0, 4, 6, 0, 0, 13, 0, 78, 0, 0, 19, 14];
numbers.sort((a, b) => {
if (b === 0) return -1;
return 1;
});
console.log(numbers); //[7, 2, 3, 4, 6, 13, 78, 19, 14, 0, 0, 0, 0, 0, 0]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.