一、有效字母异位词
简单的用数组做哈希表,每个字符对应的assci码直接进行映射计数。
class Solution {
public:
bool isAnagram(string s, string t) {
int hash[1000]={0};
for(int i=0;i<s.size();i++){
hash[s[i]-'a']++;
}
for(int i=0;i<t.size();i++){
hash[t[i]-'a']--;
}
for(int i=0;i<1000;i++){
if(hash[i]!=0)return false;
}
return true;
}
};
二、两个数组的交集
这是学完C++的stl容器后第一次使用set,充分感受到他去重的方便性。但是其中的操作还不熟练,需要再做几次来熟悉,尤其是对迭代器和构造函数的使用
本题的实现思路是,先将nums1数组放到一个unoderder_set中先做个去重的操作,然后用一个类似foreach的循环,找到nums2中存在数字的迭代器,并把它加到结果集合中,最后根据题目定义的vector类型,把set类型用迭代器重新赋值成vector返回
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int>result;
unordered_set<int>num_set(nums1.begin(),nums1.end());
for(int num:nums2){
if(num_set.find(num)!=num_set.end()){
result.insert(num);
}
}
return vector<int>(result.begin(),result.end());
}
};
三、快乐数
这个题说是用set,但是我不明白,为什么要用set或者说,我根本抓不到这个题的突破口在哪。我没有找到的关键点是,只要他不唯一,就会一直循环,一直循环就会出现重复值,出现重复值就可以用哈希表。
因此,这个题要先找到,一个数的各位的平方和是多少,编写一个getsum的函数,用于计算每个数字的平方和,并且用于elem元素的更新。
在while死循环内,设置两个结束分支,第一个,最后平方和转成1,那么return false。否则就检查unordered_set的迭代器,看看它是否出现过,没有出现过就加一,出现过就返回0
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int>result;
unordered_set<int>num_set(nums1.begin(),nums1.end());
for(int num:nums2){
if(num_set.find(num)!=num_set.end()){
result.insert(num);
}
}
return vector<int>(result.begin(),result.end());
}
};
四、两数之和
本题用到了stl中另一个容器map中的unordered_map
这个容器能够把遍历过元素和下标存放起来,查询时,用target与查询过的元素作差。
用到的map操作需要注意的是,先用auto来定义一个自适应迭代器,来替换已经存放过的元素
并且返回值必须是一个{ },想要调用map键值对中的value值,要用->second来调用
map的插入insert({})内也要用{ }的形式插入
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>map;
for(int i=0;i<nums.size();i++){
auto iter=map.find(target-nums[i]);
if(iter!=map.end()){
return {iter->second,i};
}
else{
map.insert({nums[i],i});
}
}
return {};
}
};
哈希表真好玩