今日是代码随想录第六天,学习了哈希表有关的内容
242 有效的字母异位词
题目描述不再详细说明,具体的就是判断两个单词里面的字数数量是否一样
具体代码如下:
class Solution {
public:
bool isAnagram(string s, string t) {
// int arr[26]={};
// for(int i=0;i<s.size();i++){
// int index = s[i]%97;
// arr[index]+=1;
// }
// for(int i=0;i<t.size();i++){
// int index = t[i]%97;
// arr[index]-=1;
// }
// for(int i=0;i<26;i++){
// if(arr[i]!=0){
// return false;
// }
// }
// return true;
if(s.length()!=t.length()){
return false;
}
else{
sort(s.begin(),s.end());
sort(t.begin(),t.end());
}
return s==t;
}
};
注释掉的方法是哈希表的方法,还有一种复杂度比较高,但是实际想起来比较容易的办法,就是对两个字符串先进行排序,看排序之后的是否是相同的,当然这个办法有点过于投机取巧了,还影响了原来的字符串,不推荐。
349 两个数组的交集
本题在于对unordered_set的使用,具体来说就是先将一个数组 转化为unordered_set,然后遍历第二个数组在第一个set中进行查找,查找到我们需要的元素的话,就存到answer中代码如下
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> nums_set(nums1.begin(),nums1.end());
for(int num:nums2){
if(nums_set.find(num)!=nums_set.end()){
result_set.insert(num);
}
}
return vector<int>(result_set.begin(),result_set.end());
}
};
202 快乐数
本题在于对题目的理解,要判断出会陷入循环的和不会陷入循环的情况,如果一旦是1,则就return true,一旦发现末尾的数字出现过了,那么就说明进入循环了
class Solution {
public:
int getSum(int n){
int sum = 0;
while(n>0){
sum+=(n%10)*(n%10);
n/=10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> set;
while(1){
int sum = getSum(n);
if (sum == 1) {
return true;
}
if (set.find(sum) != set.end()) {
return false;
} else {
set.insert(sum);
}
n = sum;
}
}
};
1 两数之和 梦破碎的的地方
这个题目是leetcode上的第一题,但是就这个题,我看了好多遍了,自己写还是磕磕绊绊的,真的很烦人,今天试一下自己写出来
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map <int,int> map;
for(int i = 0; i < nums.size(); i++) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]);
if(iter != map.end()) {
return {iter->second, i};
}
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};
哈希表的第一天就到这里了,今晚上一定要复习一下