代码随想录算法训练营第六天

351 阅读1分钟

day6

结束了数组和链表的内容,今天开始哈希表的学习了。

242.有效的字母异位词 题目链接:leetcode.cn/problems/va… 本题解决思路就是创建一个数组哈希表record来记录两字符串各自字母出现的频率,最后判断是否一一对应。 代码如下:

public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};//用record数组记录两字符串每个字母出现的频率
        for (int i = 0; i < s.size(); i++) {
            record[s[i] - 'a']++;//这里是s[i] - 'a'的意义是将ASCII码转化为record数组的索引
        }
        for (int i = 0; i < t.size(); i++) {
            record[t[i] - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if(record[i] != 0) {
                return false;//若record数组的内容依旧没变,证明两字符串所含的字母一一对应,是有效的字母异位词,否则不是。
            }
        }
        return true;

    }
};

349. 两个数组的交集

这题之前没有规定数组大小,所以不能使用数组。那就从这里开始学习使用set。 代码如下:

public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set;//用于存放结果,set还能顺便去重
        unordered_set<int> nums_set(nums1.begin(), nums1.end());
        for (int num :nums2) {
            if (nums_set.find(num) != nums_set.end()) {//若找到对应的值,则 存入result
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end());

    }
};```



# 第202题. 快乐数
题目链接:[202. 快乐数 - 力扣(LeetCode)](https://leetcode.cn/problems/happy-number/)
这题做法和上一题很相似,就套着一个数学的皮罢了。顺便复习一下对数值各单位的操作。
```class Solution {
public:
    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;

        }
    }
    int getSum(int n) {
        int sum = 0;
        while(n) {
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
};```

##  1.两数之和
题目链接:[1. 两数之和 - 力扣(LeetCode)](https://leetcode.cn/problems/two-sum/)
力扣第一题,梦开始的地方。这题解决思路是在当前元素之前再找一个和当前元素之和等于所需的元素,并且返回下表。这里由于用到了,两个需要存储的值,set不满足,数组更不满足,因此我们使用了map。map里的key存储元素值,value存储下标,具体代码如下:
```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++) {
            auto iter = map.find(target - nums[i]);
            if(iter != map.end()) {
                return {iter->second, i};
            }
            map.insert(pair<int, int>(nums[i], i));

        }
        return {};
    }
};```