力扣刷题——哈希表day3

力扣刷题——哈希表day3

1、有效的字母异位词

力扣序号242
解题思路:合理使用哈希表或者哈希表的思想解决该题。
解题步骤:

  • 本题的难度较低,主要目的是记录两个字符串中的字符是否全部出现,因此可以用unordered_map方法记录,但是本题考虑到只有小写的26个字母,因此用数组也是可以解决的。
  • 方法一,使用unordered_map方法
  • 方法二,使用数组

代码如下:

//方法一:unordered_map方法
class Solution {
public:
    bool isAnagram(string s, string t) {
        if (s.size() != t.size()) return false;
        unordered_map<char,int> map;
        for (int i = 0; i < s.size(); i++) {
            map[s[i]]++;
            map[t[i]]--;
        }
        for (auto ch : map) {
            if (ch.second != 0) {
                return false;
            }
        }
        return true;
    }
};
//方法二:数组
class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};
        for (int i = 0; i < s.size(); i++) {
            // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
            record[s[i] - 'a']++;
        }
        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数组所有元素都为零0,说明字符串s和t是字母异位词
        return true;
    }
};

2、两个数组的交集

力扣序号349
解题思路:本题是得到两个数组的交集,并且将交集输出,要求结果中无重复数字,这个题目细读下来直接用unordered_set比较合适,并且合理使用erase()函数可以很好的判断重复数字,防止添加重复数字到结果数组中。
解题步骤:

  • 首先理解题意,我们可以将第一个数组映射入unordered_set中。
  • 然后遍历第二个数组,寻找该数组中是否有相同的数,如果有的话我们将该数加入到我们的结果数组中,并且将该数在unordered_set中删除,防止后续添加重复的数。

代码如下:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result;
        unordered_set<int> set(nums1.begin(), nums1.end());
        for (int num : nums2) {
            if (set.erase(num)) {
                result.push_back(num);
            }
        }
        return result;
    }
};

函数erase()详细讲解:
在 C++ 中,erase() 函数是一个常用的成员函数,用于从容器中删除元素。它的行为会根据不同类型的容器略有差异。对于 std::unordered_set 和其他标准库容器,erase() 函数的作用如下:

1). std::unordered_set:

  • 当用于 std::unordered_set 时,erase() 可以删除集合中的特定元素。你可以传递一个要删除的元素的值给 erase() 函数,它会尝试在集合中找到并删除这个元素。
  • 如果找到并删除了该元素,erase() 返回 1;否则返回 0。这意味着你可以使用 erase() 的返回值来判断一个元素是否存在于集合中并已被删除。

2). 其他序列容器(如 std::vector, std::list, std::deque 等):

  • 在这些容器中,erase() 用于删除指定位置的元素或一段范围内的元素。通常,你需要传递一个迭代器(指向要删除的元素或范围的开始)给 erase() 函数。
  • erase() 函数执行后,被删除元素之后的所有元素都会向前移动来填补空位,并且容器的大小会相应减少。

使用 erase() 是管理容器中元素的一种有效方法,特别是当你需要根据特定条件移除元素时。例如,在判断两个数组的交集时,你可以用 std::unordered_set::erase() 来检查一个元素是否存在于集合中,如果存在则将其从集合中删除,这样可以确保结果集中不会出现重复元素。

3、快乐数

力扣序号202
解题思路:我们要理解题意,在给的数字的每一位平方相加,得到的新的数字也如此操作,一直循环下去,直至该数字为1,为快乐数,但是我们需要理解,如果说这个过程中有出现重复数出现,那一定是个死循环不会到1,那就false,如果一直不出现重复的我们就一直循环,直至有一个退出条件,这就是做这道题的思路,可以使用unordered_set快速寻找是否有重复数出现。

解题步骤:

  • 其实在思路里说的差不多了,主要是为了在我们设定的死循环里寻找一个可以退出的条件,即为我们的判断结果。
  • 构造函数getSum(),方便我们每一次得到sum值。
  • 判断sum值是否为1,如果是返回true,结束。
  • 判断sum值是否在set中存在过,如果存在,返回false,结束。否则插入set中。
  • 将sum赋予n,继续下一轮的循环。

代码如下:

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> 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;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值