【水滴计划 | 每日两题】:有效的字母异位词、两个数组的交集

115 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

1、写在前面

大家好,我是翼同学,这里是【水滴计划 | 刷题日志】

每日两题,拒绝摆烂。

2、内容

2.1、题目一:有效的字母异位词

链接:242. 有效的字母异位词 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

image.png

(3) 解题

解题代码一:

class Solution {
public:
    bool isAnagram(string s, string t) {

        // 定义一个数组letter,用于记录字母出现次数
        int letter[26] = {0};
        // 遍历字符串 s
        for (int i = 0; i < s.size(); i++) {
            // 将 s[i]-'a' 所在的letter元素做自增操作,统计字符串s中字符出现的次数 
            letter[s[i] - 'a']++;
        }
        // 遍历字符串t
        for (int i = 0; i < t.size(); i++) {
            // 将 t[i]-'a' 所在的letter元素做自减操作,统计字符串t中字符出现的次数 
            letter[t[i] - 'a']--;
        }
        // 遍历数组letter,如果有元素不为零,则说明字符串 s 和 t 不相等
        for (int i = 0; i < 26; i++) {
            if (letter[i] != 0)  return false;
        }
        // 如果letter数组所有元素都为零0,说明字符串s和t是字母异位词
        return true;
    }
};

image.png

解题代码二:

class Solution {
public:
    bool isAnagram(string s, string t) {
        // 如果字符串的长度不同,则肯定不是字母异位词
        if ( s.length() != t.length() ) return false;
        // 对字符串s进行排序
        sort(s.begin(), s.end());
        // 对字符串t进行排序
        sort(t.begin(), t.end());
        // 如果排完序后的字符串相等,则肯定是字母异位词
        return s == t;
    }
};

解题代码三:

class Solution {
public:
    bool isAnagram(string s, string t) {
        // 用两个字符串分别初始化两个`unordered_multiset`
        // 如果两个容器相等则说明这两个字符串包含的所有字符都相同,则属于字母异位词。
        return unordered_multiset(begin(s), end(s)) == unordered_multiset(begin(t), end(t));
    }
};

2.2、题目二:两个数组的交集

链接:349. 两个数组的交集 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

image.png

(3) 解题

解题代码一:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        // 定义一个unordered_set容器变量用于存放结果(可去重)
        unordered_set<int> resultSet;
        // 定义一个数组record,用于记录数值是否在nums1中出现过
        int record[1005] = {0};
        // 将nums1中出现的数字记录在数组record中
        for (int num : nums1) { 
            record[num] = 1;
        }
        // 遍历数组nums2,如果record数组中有元素为1,则该下标就是一个目标数字,存入结果中
        for (int num : nums2) { 
            if (record[num] == 1) {
                resultSet.insert(num);
            }
        }
        return vector<int>(resultSet.begin(), resultSet.end());
    }
};

image.png

解题代码二:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        // 将数组nums1中的元素存入到unordered_set容器中(去重)
        unordered_set<int> numsSet(nums1.begin(), nums1.end());
        // 定义一个unordered_set容器变量用于存放结果
        unordered_set<int> resultSet;
        // 遍历数组nums2
        for (int num : nums2) {
            // 如果当前数组nums2的元素,在容器numsSet中也有出现,则存入容器resultSet
            if (numsSet.find(num) != numsSet.end()) {
                resultSet.insert(num);
            }
        }
        // 最终返回结果
        return vector<int>(resultSet.begin(), resultSet.end());
    }
};

备注:在上方解题中,有一段代码为:

if (numsSet.find(num) != numsSet.end()) {
    resultSet.insert(num);
}

需要注意,对于unordered_set容器来说,find(key)函数会查找以值为key的元素,如果找不到则会返回一个指向容器中最后一个元素之后位置的迭代器,而end()函数就是用于 返回指向容器中最后一个元素之后位置的正向迭代器。因此代码numsSet.find(num) != numsSet.end()就能判断当前数组nums2中的元素是否在容器numsSet中有出现过。

3、写在最后

好了,今天就刷到这里,明天再来。