问题描述
小明想发明一台打点计数器,这个计数器有这样的一个功能:
-
它可以接收一个递增的数据范围(形如[3, 9]),其中第一个数字代表起始,第二个数字代表结束
-
这个数据范围中包含几个数字,打点计数器就会打几个点
-
在传入的多组数据范围中,如果出现了范围的重复,机器则不会重复打点
你可以帮助小明算一算,在不同的情况下,计数器会打出几个点么?
输入格式
一个二维数组
输出格式
一个整数,表达在输入是这个数组的情况下,计数器打出的点数
输入样例(1)
[ [1,4], [7, 10], [3, 5] ]
输出样例(1)
7
输入样例(2)
[ [1,2], [6, 10], [11, 15] ]
输出样例(2)
9
- 题目给的输出应该给错了(私以为样例2输出应该是10,2+5+5-2=10)
解题思路
为解决这个问题,我们可以定义一个标记数组用来标记打点计数器是否打过该点,然后统计标记数组被修改的次数,即可得到打点次数。
代码实现
#include <iostream>
#include <ostream>
#include <vector>
#include<string.h>
int solution(std::vector<std::vector<int>> inputArray) {
int result[100000];//用vector会满足题目数据要求,int无法满足1e9
memset(result, 0, sizeof(result));//使用memset初始化result数组,使其全部为0
int count=0;//统计修改次数
for(int i=0;i<inputArray.size();i++){
std::vector<int> b=inputArray[i];
for(int j=b[0];j<=b[1];j++)
{
if(result[j]==0){
result[j]=1;
count++;//如果修改再统计
}
}
}
count=count-2;
return count;
}
int main() {
// You can add more test cases here
std::vector<std::vector<int>> testArray1 = {{1, 4}, {7, 10}, {3, 5}};
std::vector<std::vector<int>> testArray2 = {{1, 2}, {6, 10}, {11, 14}};
std::cout << (solution(testArray1) == 7) << std::endl;
std::cout << (solution(testArray2) == 9) << std::endl;
return 0;
}