一、問題描述:
將0移到最后,在原數組操作,並且不能改變源數據順序。
示例:輸入:[2,0,0,1,0,3], 結果:[2,1,3,0,0,0]
二、問題分析與解決:
注意是在原數組上操作,不要進行任何數組拷貝操作,還要保證操作后的源數據順序不變。
直接上JS代碼:
//ES6箭頭函數寫法 const moveZero = (arr) => { let y = 0;//定義y用於控制循環結束 for (let i = 0; y < arr.length; y++) { if (arr[i] === 0) arr.push(arr.splice(i, 1)[0]);//循環到是0的位置就刪除該元素0並且在arr末尾push進這個元素0,由於splice刪除了該位置元素,所以i不用+1,下次循環仍然檢查i位置的元素 else i++;//循環到不是0的位置就繼續往后循環 } return arr;//返回操作后的原數組 }; //運行如下: moveZero([2,0,0,1,0,3]);//[2,1,3,0,0,0]
注: 細節之處體現差別,Array.prototype.splice(startIndex, counts, addElement)方法的作用和三個參數的含義盡人皆知。但是很少有人關心它的返回值,splice的返回值是原數組中被刪除的元素組成的數組,如[1,2,3].splice(1,2)返回被刪除的元素數組[2,3],利用這一點可以將代碼簡化,即arr.push(arr.splice(i, 1)[0]),直接將刪除后的元素push進原數組。順便提一下push方法返回的是push操作之后,原數組的length屬性,如[].push(1,2,3)返回數字3,即push后數組[1,2,3]的length為3.
如有疑問歡迎留言討論,謝謝!
(本文為原創博客,嚴禁非法抄襲或復制,轉載請注明出處:https://www.cnblogs.com/xiao-pengyou/)