力扣刷题——哈希表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;
        }
    }
};
  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值