一道leetcode
有暴力解法,其实根据题意(可以假设字符串只有小写字母),稍微思考,可以利用小写字母的ascii码是连续的特性,构造一个容量为26的哈希数组,第一遍遍历s,哪个哪个字母出现就在对应的数组位置加一,第二遍遍历t,对应减一,最后遍历数组,数组只要有一个位置不为0则不符合题意。
还有一道
注意题目没说数组中的元素都是一位数,只是测试用例都是一位数。
「使用数据来做哈希的题目,都限制了数值的大小,例如哈希表:可以拿数组当哈希表来用,但哈希值不要太大,上道题目中只有小写字母,或者数值大小在[0- 10000] 之内等等。」
而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
此时就要使用另一种结构体了,set ,关于set,C++ 给提供了如下三种可用的数据结构:
std::set
std::multiset
std::unordered_set
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> resultSet1;
unordered_set<int> resultSet2;
vector<int> resultVector;
for (int i = 0; i < nums1.size(); i++) {
resultSet1.insert(nums1[i]);
}
for (int i = 0; i < nums2.size(); i++){
if (resultSet1.find(nums2[i]) != resultSet1.end())
resultSet2.insert(nums2[i]);
}
for (int r : resultSet2)
{
resultVector.push_back(r);
}
return resultVector;
}