原始題目如下:(8kyu)
You've got much data to manage and of course you use zero-based and non-negative ID's to make each data item unique!
Therefore you need a method, which returns the smallest unused ID for your next new data item...
Note: The given array of used IDs may be unsorted. For test reasons there may be duplicate IDs, but you don't have to find or remove them!
翻譯:
給一陣列,每一元素代表id編號,根據此陣列找出未被使用的最小id
範例:
nextId([0,1,2,3,4,5,6,7,8,9,10])->回傳 11
nextId([1,2,0,2,3,5])-> 回傳 4
function nextId(ids){
let unused;
for(let i=0; i<=ids.length;i++){
if( !ids.includes(i)){
unused =i;
return unused===undefined?0:unused
}
}
}
input為一陣列ids
,每一個元素代表id編號,編號由0開始
在理想沒有跳號的情況下:
ids=[0,1,2,3,4] 下一組最小可用編號,剛好為ids.length-->5
於是想到的土法煉鋼法,從0開始檢查1,2,3,4....一直到ids.length
使用includes
一個一個確認array中的元素
function nextId(ids){
var x = 0;
while (ids.includes(x)) x++;
return x;
}
一樣也是includes的概念,使用while
,若ids陣列包含x,繼續檢查ids陣列是否包含x+1。
常見使用迴圈有幾種方式:
很多文章可能都會爭論討論哪種效能好,事實上,這4種寫法,只有for-in
loop效能會明顯的差於其他3者。不過到底該選擇哪種loop,主要還是取決於需求,而不是因為哪個效能好選哪個。
For-In Loop
主要用來列舉物件中的屬性,也包含繼承來的方法
若要提高loop的效能可以考慮朝兩方面調整:
for (var i = 0; i < 10; i++){ //loop body}
拆解for loop包含四個部分:
for (var i = 0; i < items.length; i++){
process(items[i]);
}
每次執行完process(items[i])後,i=i+1 --> 找出items.length值 --> 檢測i是否小於items.length
每次都要再重新找items.length
的值,可以簡化成:
for (var i = 0, len = items.length; i < len; i++){
process(items[i]);
}
先將len儲存起來,避免每次iteration重複執行。
for (var i = items.length; i--; ){
process(items[i]);
}
這是另一種寫法,不是因為i--
比i++
好,而是因為compare with 0
不需要特別宣告,預設就是它。
可以想成:
for(var i = array.length; i--; )
// pseudo code
i=array.length
:LOOP_START
decrement i
if [ i = 0 ] goto :LOOP_END
... BODY_CODE
:LOOP_END
其中i=0
,是一個常數
而一般常用的寫法,會給初始值、終止條件及遞增值:
for(var i = 0 ; i < array.length; i++ )
// pseudo code
end=array.length
i=0
:LOOP_START
if [ i < end ] goto :LOOP_END
increment i
... BODY_CODE
:LOOP_END
將原本[i=0]
的部分替換成[i< end]
以上參考自stack overflow: Are loops really faster in reverse?,裡面有很多的討論
其他推薦閱讀:
MDN web docs:Loops and iteration
How to optimize your JavaScript apps using Loops
JS之for迴圈優化
以上為今日分享的內容,若有錯誤或是建議,請再隨時和我聯繫。