小明的通讯录
小明的通讯录,对于打进或拨出的电话,只要是新号码,手机均会自动进行储存。
给定小明在一个月的使用期间的手机通讯记录,请给出此时此刻小明的手机中存储了多少个电话号码。
输入
7
1000002 3000004 9000002 1000002 1000011 1234567 1000002
输出
5
通过构建哈希表来降低插入查找的时间复杂度
#include <iostream>
#include <vector>
using namespace std;
const int N = 1000000;
const int MAX_SIZE = N + 1;
typedef int T;
vector<T> vet(MAX_SIZE);
int hashFunction(int element) {
// 取模的为哈希函数的取余数
return element % MAX_SIZE;
}
int getNextPosition(int pos) {
// 取模的是表长
return (pos + 1) % MAX_SIZE;
}
bool hashSearch(vector<T> &array, int element, int &pos) {
bool res = false;
pos = hashFunction(element);
while (array[pos] != 0 && array[pos] != element) {
pos = getNextPosition(pos);
}
if (array[pos] == element) {
res = true;
}
return res;
}
bool hashInsert(vector<T> &array, T element) {
bool res = false;
int index;
//在该位置上没有元素
if (!hashSearch(array, element, index)) {
array[index] = element;
res = true;
}
return res;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int element = 0;
scanf("%d", &element);
hashInsert(vet, element);
}
n = 0;
for (int i = 0; i < MAX_SIZE; ++i) {
if (vet[i]) {
++n;
}
}
cout << n << "\n";
return 0;
}