1. 题目要求
2. 解答
2.1 哈希表做法
哈希表的查找复杂度是 1,可以将每个数插入一个 unordered_set
然后查找是否有相反数,由于每个数字最多只会被查找记录一次,所以时间复杂度是
O
(
n
)
O(n)
O(n)。
CCF-CSP 在线训练系统没有开放 C++11 选项,而 unordered_set
是 C++11 的 STL 的一种,所以在测试系统上会出现编译错误。不过据说考试时可以自选是否使用 C++11 。在此还给出一种数组做法,以备考试时随机应变。
#include <iostream>
#include <unordered_set>
using namespace std;
int main()
{
unordered_set<int> hash;
int n;
scanf("%d", &n);
int a, cnt = 0;
while(n --) {
scanf("%d", &a);
if(hash.count(-a)) cnt ++;
hash.insert(a);
}
printf("%d", cnt);
return 0;
}
2.2 数组做法
同样的可以开一个计数数组,遇到下标值或者其相反数就 +1,最后看数组中的元素有多少个是 2 即可。
这个思路可以成功的条件是,题目中说明了没有重复的数字。
#include <iostream>
#include <cstdlib>
using namespace std;
const int N = 1010;
int nums[N];
int main()
{
int n;
scanf("%d", &n);
int a;
while(n --) {
scanf("%d", &a);
nums[abs(a)] ++;
}
int res = 0;
for(int i = 0; i < N; i ++) {
if(nums[i] == 2) res ++;
}
cout << res;
return 0;
}
3. 总结
这一题比较简单,但是也要注意题目的条件。第二种做法比较巧妙,是建立在没有重复数据的基础上的,如果有重复数据的话,则适合采用第一种做法。(当然如果有重复数据,可能还会有其他的规则,比如限定在某个数之前是否出现了相反数,之后出现的不计等)