想到直接使用哈希表记录字幕出现的数量
class Solution {
public:
bool isAnagram(string s, string t) {
unordered_map map;
for (auto c : s)
map[c]++;
for (auto c : t) {
map[c]--;
}
for(auto element:map){
if(element.second != 0)
return false;
}
return true;
}
};
代码随想录 (programmercarl.com)
因为字母只有26个,所以可以直接使用一个数组,存储各个字母出现的次数,更加省时间空间
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) {
// record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了 字符。
return false;
}
}
// record数组所有元素都为零0,说明字符串s和t是字母异位词
return true;
}
};
关键点是要保证结果中不能有重复的数字
我选择使用一个map记录结果中输出的数量,防止重复
注意:if (map.find(num) != map.end() && map[num] == 0)
这一句中不能把map[num] == 0放在前面,防止访问到不存在的出错。
class Solution {
public:
vector intersection(vector &nums1, vector &nums2) {
unordered_map map;
vector res;
for (auto num : nums1)
map[num] = 0;
for (auto num : nums2) {
if (map.find(num) != map.end() && map[num] == 0){
res.emplace_back(num);
map[num]++;
}
}
return res;
}
};
代码随想录 (programmercarl.com)
也可以选择这种方法:使用unordered_set的特性:每种东西只留一个
使用两个set过滤两个数组,最后得到的肯定没有重复的数字
class Solution {
public:
vector intersection(vector& nums1, vector& nums2) {
unordered_set result_set; // 存放结果,之所以用set是为了给结果集去重
unordered_set nums_set(nums1.begin(), nums1.end());
for (int num : nums2) {
// 发现nums2的元素 在nums_set里又出现过
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
return vector(result_set.begin(), result_set.end());
}
};
这个还是有点技巧的:
class Solution {
public:
bool isHappy(int n) {
unordered_set set;
while (true) {
//注意sum要在这里更新为0
long sum = 0;
while (n != 0) {
sum += (n % 10) * (n % 10);
n /= 10;
}
n = sum;
if (sum == 1)return true;//如果1,快乐就完事了
if (set.find(n) != set.end()) {
//不是1就去找这个sum之前出现过没有,有的话进入循环直接退出
return false;
} else {
//没有的话,存放新得到的sum
set.emplace(n);
}
}
}
};
代码随想录 (programmercarl.com)
类似我的,只不过是把求sum封装起来
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 set;
while(1) {
int sum = getSum(n);
if (sum == 1) {
return true;
}
// 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
if (set.find(sum) != set.end()) {
return false;
} else {
set.insert(sum);
}
n = sum;
}
}
};
就使用map,存放当前这一位数值的 索引 和 需要凑的数(target-nums[i])
,然后就找当前数map中是否有:
关键点:
class Solution {
public:
vector twoSum(vector &nums, int target) {
unordered_mapmap;
for (int i = 0; i < nums.size(); ++i) {
//要注意map查找 要在 map插入这一步的前面,注意注意
if(map.find(nums[i])!=map.end())
return {i,map.find(nums[i])->second};
map[target - nums[i]] = i;
}
return {};
}
};
代码随想录 (programmercarl.com)
class Solution {
public:
vector twoSum(vector& nums, int target) {
std::unordered_map map;
for(int i = 0; i < nums.size(); i++) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]);
if(iter != map.end()) {
return {iter->second, i};
}
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert(pair(nums[i], i));
}
return {};
}
};
day6结束