求解重叠区域线段覆盖总长度_求线段总长度_线段覆盖长度

总结了网上目前流传的两种方法,并写出了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年字节跳动前端面试题

posted @ 2021-11-01 19:55  Bravo_Jack  阅读(234)  评论(0编辑  收藏  举报