有效字母的异位词
原题链接:有效的字母异位词
思路:先判断二者长度是否相等,利用unordered_map,记录各个字母出现的次数,在另一个字符串中,减去出现的次数,当某个字符出现次数为负数时,则不匹配
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size())
return false;
unordered_map<char,int> m;
for(auto i : s) m[i]++;
for(auto i : t){
m[i]--;
if(m[i]<0){
return false;
}
}
return true;
}
};
两个数组的交集
原题链接:两个数组的交集
思路:判断交集,重复出现的问题,可以考虑利用哈希表,哈希表常见有三种应用:数组,set,map。这里由于数据范围较小,可以使用数组,利用下标判断该元素是否出现。也可以使用集合去重,然后遍历一个集合,去判断是否重复。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//数组
vector<int>res;
// bool temp[1005]{false};
// for(auto i:nums1) temp[i]=true;
// for(auto i:nums2) {
// if(temp[i] == true){
// res.push_back(i);
// temp[i] = false;
// }
// }
//set
unordered_set<int> s1,s2;
for(auto i : nums1) s1.insert(i); //去重
for(auto i : nums2) s2.insert(i);
for(auto i : s2){
if(s1.find(i)!=s1.end()){
res.push_back(i);
}
}
return res;
}
};
快乐数
原题链接:快乐数
思路:什么情况下无法得到1呢?我们知道,int长度有限,每位数平方和存在最大值。如果一个数永远无法成为1,那么必定出现重复循环,利用哈希表来检测重复。
class Solution {
public:
unordered_set<int>m;
bool isHappy(int n) {
if(m.find(n) != m.end()){
return false;
}
int sum = 0;
int t = n;
while(n!=0){
int temp = n%10;
n/=10;
sum+=temp*temp;
}
if(sum == 1){
return true;
}else{
m.insert(t);
return isHappy(sum);
//2 , 4 , 16 , 37, 58, 89 , 145 , 42 , 20 , 4
}
}
};
两数之和
原题链接:两数之和
思路:容易想到,使用两层for循环遍历。抽象一下,题目关键在于我们需要找到某个数在数组中是否存在,容易想到使用哈希表。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> m;
for(int i = 0;i<nums.size();i++){
int temp = target-nums[i];
if(m.find(temp) != m.end()){
return{i,m.find(temp)->second};
}
m[nums[i]] = i;
}
return {};
}
};