力扣刷题——哈希表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;
}
}
};