1. 程式人生 > 其它 >求解重疊區域線段覆蓋總長度_求線段總長度_線段覆蓋長度

求解重疊區域線段覆蓋總長度_求線段總長度_線段覆蓋長度

總結了網上目前流傳的兩種方法,並寫出了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年位元組跳動前端面試題