D8 209.字母异位词 349.两个数组的交集
209 字母异位词(力扣:[https://leetcode.cn/problems/valid-anagram/])
条件: 给定两个字符串,判断调换字母顺序后能否一一对应;
Tips:
- 判断元素出现次数首选哈希表,也就是把非顺序数字字符映射到有序简单(如数组)的结构,方便根据index快速索引;
这里的元素数量有限(小写字母26个)所以可以选数组; - 注意虽然描述是s在t前,但实际比较不应分先后,也就是会存在t比s字符串长的情况,所以最后检索record时要保证没有1和-1;
点击查看代码
class Solution {
public:
bool isAnagram(string s, string t) {
//record只用记录26个字母各自出现次数,只有小写的26个
int record[26] = {0};
//遍历s,如s[0]是a,则record[0]也就是record[s[0] - a]计数加一
for( int index = 0; index < s.size(); record[ s[index] - 'a' ] ++, index++ ){}
//遍历t,如t[0]是a,则record[0]也就是record[t[0] - a]计数减一
for( int index = 0; index < t.size(); record[ t[index] - 'a' ] --, index++ ){}
//检查record,内全为0则为异位词,出现1或-1则非异位词
//注意-1!所以if条件要列为不等而非小于
for( int index = 0; index < 26; index++ ){
if(record[index] != 0) { return false; }
}
return true;
}
};
349 两个数组的交集(力扣:[https://leetcode.cn/problems/intersection-of-two-arrays/])
条件: 给定两个数组,返回交集,交集元素不重复且可以不考虑顺序;
Tips:
- 不重复(非multi的set的属性)且可以不考虑顺序(哈希桶按照求余存储而非原顺序)使用unordered_set,具体见代码注释,代码来源deepseek
点击查看代码
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//要求结果没有重复元素,所以直接定义为无序set
unordered_set<int> ans = {};
//将nums1去重,使用构造函数而不是直接赋值
unordered_set<int> originNums1(nums1.begin(), nums1.end());
//再一个一个拿nums2的和去重后的nums1比较,由于unordered set可以使用find直接索引所以复杂度为O(1);
//范围循环只适用于数组和容器,这里遍历nums2等效于auto np = nums2.begin(); np != nums2.end; np++,此时循环体内需要定义int num = *np;
for( int num : nums2 ){
//将nums2的元素使用find在nums1里查找,if意为find找不到num会返回nums1.end()
if( originNums1.find(num) != originNums1.end() ){
//插入到答案集合里
ans.insert(num);
}
}
//这里不需要返回一个新名称的容器
return vector<int>(ans.begin(), ans.end());
}
};
浙公网安备 33010602011771号