Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
內容目錄
將陣列中的數字,有連續整數的情況用連字號 (-) 連接起來。舉例來說 [1,2,3]
會變成 '1-3'
。其中需要特別注意的是只有連續兩個整數時,不用連接。
function solution(list){ let temp = 0; return list.reduce( ( acc, cur, curI, arr ) => { if ( cur === arr[curI-1] + 1 && cur === arr[curI+1] -1 ) { temp++; return acc; } else if( temp > 0 ) { temp = 0; return acc + '-' + cur; } else { temp = 0; return acc + ',' + cur; } } ); }
在原本的構想中 temp
這個變數的目的,是用來判斷是否是連續 3 個數字,當 temp
大於 0 的時候,代表前一步已經是符合「前後都有」的情境,因此便會是連續 3 個整數。
function solution2(individualIntegers) { return individualIntegers .reduce(splitIntoRanges, []) .map(convertToRange) .join(","); } function splitIntoRanges(ranges, number) { if (!ranges.length) { ranges.push([number]); return ranges; } var lastRange = ranges[ranges.length - 1]; var lastNumber = lastRange[lastRange.length - 1]; number === lastNumber + 1 ? lastRange.push(number) : ranges.push([number]); return ranges; } function convertToRange(range) { return range.length < 3 ? range.join(",") : range[0] + "-" + range[range.length - 1]; }
function solution3(list){ for(var i = 0; i < list.length; i++){ var j = i; while(list[j] - list[j+1] == -1) j++; if(j != i && j-i>1) list.splice(i, j-i+1, list[i] +'-'+list[j]); } return list.join(); }
票選的最佳解中,是透過拆分函式的方式,用 convertToRange()
來判斷是否為連續數字,整體作法上比較像是我最早嘗試的方向。
另外一種解法,則是先透過 var j = i
,讓 list[j]
可以快速到每個區間的最大值,接著再用 splice()
的方式減去陣列中介於區間的值,再來串接每個頭尾字串。執行上效能最好。
這次我可能太執著於 Array.reduce()
的作法,所以試了蠻久才把結果試出來。下面附上當初測試邏輯時的完整程式碼。
function solution(list){ // TODO: complete solution let temp = 0; return list.reduce( ( acc, cur, curI, arr ) => { console.log( 'acc is: ' + acc ); console.log( 'cur is: ' + cur ); console.log( 'arr[curI-1] +1 is ' + (arr[curI-1] + 1) ); console.log( 'arr[curI+1] -1 is ' + (arr[curI+1] - 1) ); if ( cur === arr[curI-1] + 1 && cur === arr[curI+1] -1 ) { console.log( 'both true' ); temp++; return acc.toString(); } else if( cur === arr[curI - 1] + 1 && temp > 0 ) { console.log( 'one true' ); temp = 0; return acc.toString() + '-' + cur.toString(); } else { console.log( 'false' ); temp = 0; return acc.toString() + ',' + cur.toString(); } } ); }