求解重疊區域線段覆蓋總長度_求線段總長度_線段覆蓋長度
阿新 • • 發佈:2021-11-01
總結了網上目前流傳的兩種方法,並寫出了javascript版本:
let e1 = [ [2, 4], // [0, 19], [3, 8], [10, 12] ] // 解法1. 排序後掃描(機器思維) let totalLength1 = function (fragments) { let res = 0 // sort by start number let sorted = fragments.sort((a, b) => a[0] - b[0]) let start = sorted[0][0] let end = sorted[0][1] for (let i = 1; i < sorted.length; i++) { let value = sorted[i] // Pseudo code: // if hasIntersection-> (end > value[0]) then 更新end值 loop until notIntersection // else update start end value while (end > value[0]) { // 一看到while迴圈,就要想到,每個迴圈內必須手動更新變數 end = value[1] > end ? value[1] : end i++ if (i >= sorted.length) break value = sorted[i] } // accumulation res += (end - start) // update start && end value start = value[0] end = value[1] // 這個時候i表示的是下一個值的索引(下一個值因為沒有達到while條件被彈出了),下一個遍歷因為會++,所以這裡要-- i-- } return res } // 解法2. 畫素化(不考慮空間開銷) let totalLength2 = function (fragments) { let flat = fragments.flat(1) let min = Math.min(...flat) let max = Math.max(...flat) let length = max - min let pixelArray = Array(length).fill(false) for (let item of fragments) { console.log(item) for (let i = item[0] - min; i < item[1] - min; i++) { pixelArray[i] = true } } console.log(pixelArray) return pixelArray.filter(item => item == true).length } // test let res = totalLength1(e1) console.log(res)
這道題是2022年位元組跳動前端面試題