簡體   English   中英

如何將所有為零的元素移動到數組的末尾?

[英]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移到數組的末尾。 如果ab均為零或非零,則它們不會相對移動。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM