242. 有效的字母异位词
两个字符串在长度相同的情况下,所包括的字符是一样的,只是顺序不一样
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size()) return false;
unordered_map<char,int> mp;
for(auto c:s)
{
mp[c]++;
}
for(auto c:t)
{
if(mp.find(c)==mp.end()||mp[c]==0)
{
return false;
}
mp[c]--;
}
return true;
}
};
回顾关联容器的增删查改
插入:
//插入键值对
mp.insert({"xxx",1});
//插入范围迭代器
mp.insert(mp1.begin(),mp1.end());
// 直接构造元素
mp.emplace("xxx",1);
删除
mp.erase("xx")//直接删除键
mp.erase(mp1.begin(),mp1.end())
查
//find 返回查询元素的迭代器
//count 查询键的个数 0或者1
349.两个数组的交集
不考虑重复元素,所以如果是交集,直接删除键
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> st;
vector<int> res;
for(auto i: nums1)
{
st.insert(i);
}
for(auto i:nums2)
{
if(st.find(i)!=st.end())
{
res.push_back(i);
st.erase(i);
}
}
return res;
}
};
202. 快乐数
class Solution {
public:
int getSum(int n)
{
int sum=0;
while(n)
{
sum+=(n%10)*(n%10);
n/=10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> st;
while(1)
{
int sum=getSum(n);
if(sum==1)
{
return true;
}
if(st.find(sum)!=st.end())
{
return false;
}
else
{
st.insert(sum);
}
n=sum;
}
}
};
1. 两数之和
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> mp;
vector<int> res;
for(int i=0;i<nums.size();i++)
{
auto it=mp.find(target-nums[i]);
if(it!=mp.end())
{
return {i,it->second};
}
else
{
mp.emplace(nums[i],i);
}
}
return res;
}
};
小结
- 关联容器的count是返回键的个数,而不是值
- 巧妙的方法
int getSum(int n) { int sum=0; while(n) { sum+=(n%10)*(n%10); n/=10; } }
- 计算两数之和通过关联容器find(target-nums[i)操作,判断容器 内是否有合适的元素,如果先将vector给的元素都放入map,这导致find操作无法排除nums[i],所以进行以下操作
for(int i=0;i<nums.size();i++) { if(mp.find(target-nums[i])==mp.end()) { mp.emplace(nums[i],i); } else { }