手撕题解02 | 字符串哈希
字符串哈希
https://www.nowcoder.com/practice/dadbd37fee7c43f0ae407db11b16b4bf
#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;
int main() {
//关闭C++流和c流的同步,解绑cin和cout
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
unordered_set<string> unset;
for(int i=0; i<n; i++){
string s;
cin >> s;
unset.insert(s);
}
cout << unset.size() << '\n';
return 0;
}
// 64 位输出请用 printf("%lld")
1.为什么选择cin套系而不是scanf?
(1)cin写法简洁,无需记格式符
(2)cin原生支持string
(3)cin虽然效率不如scanf,但是有解决方案
2.为什么加上关闭C++流和c流的同步,解绑cin和cout?
ios::sync_with_stdio(false);:关闭 C++ 流(cin/cout)和 C 流(scanf/printf)的同步关系,不需要共享缓冲区
cin.tie(nullptr);:解绑 cin 和 cout 的绑定关系,cout 输出时不再自动刷新 cin 的缓冲区,进一步减少系统调用开销。
这两步骤可以降低计算开销
这样做有弊端但是影响很小
(1)如果混用C++流和C流会导致顺序混乱数据错误的问题,但是基本上都配套使用,不影响。
(2)cout遇到endl本来会自动刷新缓冲区立刻输出数据,但是解绑后会延迟,可以使用\n来解决
3.什么是哈希表?说说你的理解?
哈希表是以空间换取时间的一种数据结构,可以通过哈希函数把元素映射成整数,方便查找元素的存在性。
哈希表有两种,无值的哈希集合unordered_set和键值对集合unordered_map。区别如下:
查看4道真题和解析