字节青训营入门算法题:打点计时器

时间:2024-10-13 07:42:47

链接:打点计时器题目????????

题目

小明想发明一台打点计数器,这个计数器有这样的一个功能:

  • 它可以接收一个递增的数据范围(形如[3, 9]),其中第一个数字代表起始,第二个数字代表结束。
  • 这个数据范围中包含几个数字,打点计数器就会打几个点。
  • 在传入的多组数据范围中,如果出现了范围的重复,机器则不会重复打点。
    你需要帮助小明算一算,在不同的情况下,计数器会打出几个点。

解答

为了解决这个问题,我们可以使用以下步骤:

  1. 初始化一个空集合(Set),集合中的元素都是唯一的,这可以帮助我们避免重复的数字。
  2. 遍历输入的二维数组。对于每一组数据范围,我们从起始数字开始,到结束数字的前一个数字结束(因为结束数字是不包含的),将每个数字添加到集合中。
  3. 最后,返回集合的大小,即集合中不同数字的数量,这就是计数器会打出的点数。
    下面是对应的代码(javascript)实现:
function solution(inputArray) {
  let set = new Set()
  inputArray.forEach(element => {
    for (let i = element[0]; i < element[1]; i++) {
      set.add(i)
    }
  });
  return set.size;
}
function main() {
  const testArray1 = [[1, 4], [7, 10], [3, 5]];
  const testArray2 = [[1, 2], [6, 10], [11, 15]];
  console.log(solution(testArray1)); // 应该输出 7
  console.log(solution(testArray2)); // 应该输出 9
}
main();

知识点

  • 集合(Set):在JavaScript中,Set是一种集合数据结构,用于存储唯一值(不重复的值)。这非常适合我们的需求,因为我们不希望重复计算相同的数字。
  • 数组遍历(forEach)forEach 方法用于遍历数组中的每个元素。
  • 范围循环:使用 for 循环来迭代一个范围,从起始数字到结束数字的前一个数字。

讲解

在这个问题中,我们首先创建了一个空的 Set,用于存储唯一的数字。然后,我们遍历输入的二维数组。对于每个子数组(代表一个数据范围),我们使用一个 for 循环来迭代这个范围中的每个数字,并将它们添加到 Set 中。由于 Set 只存储唯一的值,所以任何重复的数字都会被自动忽略。最后,我们通过返回 Set 的大小(即 set.size)来得到计数器应该打出的点数。
例如,对于输入 [[1, 4], [7, 10], [3, 5]],我们首先将数字 1, 2, 3 添加到 Set 中,然后添加 7, 8, 9。当我们尝试添加 3, 4, 5 时,由于 3 和 4 已经在 Set 中,它们不会被重复添加。因此,Set 的大小最终为 7,这就是计数器应该打出的点数。