242. 有效的字母异位词
讲解
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.length() != t.length())
return false;
map<char, int> map_s;
map<char, int> map_t;
for(int i=0; i<s.length(); i++)
map_s[s[i]]++;
for(int i=0; i<t.length(); i++)
map_t[t[i]]++;
//字符数相同,逐个比较
for(int i=0; i<t.length(); i++){
if(map_s[t[i]] != map_t[t[i]])
return false;
}
return true;
/*
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;
*/
}
};
349. 两个数组的交集
详解
c++ set map基础
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
unordered_set<int> 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<int>(result_set.begin(), result_set.end());
}
};
202. 快乐数
详解
class Solution {
public:
map<int, int> map_square;
map<int, int> map_exists;
unordered_set<int> set_list;
bool b_find = false;
//map 方法
int split_map(int n){
if(n == 1){
b_find = true;
return 0;
}
if(map_exists[n] == 1)
return 0;
map_exists[n] = 1;
int result = 0;
while(n>0){
int a = n % 10;
result += map_square[a];
n = n / 10;
}
cout << result << endl;
return result;
}
//set 方法
int split_set(int n){
if(n == 1){
b_find = true;
return 0;
}
if(set_list.find(n) != set_list.end())
return 0;
set_list.insert(n);
int result = 0;
while(n>0){
int a = n % 10;
result += map_square[a];
n = n / 10;
}
cout << result << endl;
return result;
}
bool isHappy(int n) {
for(int i=0; i<=9; i++)
map_square[i] = i*i;
//int result = split_map(n);
int result = split_set(n);
while(result != 0){
result = split_set(result);
}
return b_find;
}
};
1. 两数之和
详解
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// int size = nums.size();
// for(int i=0; i<size; i++){
// for(int j=i+1; j<size; j++){
// if(nums[i] + nums[j] == target){
// return {i, j};
// }
// }
// }
// return {};
//map 方法
map<int, int> map_result;
for(int i=0; i<nums.size(); i++)
map_result[nums[i]] = i;//map的key是值,value是下标
for(int i=0; i<nums.size(); i++){
if(map_result[target - nums[i]] && map_result[target - nums[i]] != i) //不能自己相加
return {i, map_result[target - nums[i]]};
}
return {};
/*
std::unordered_map <int,int> 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<int, int>(nums[i], i));
}
return {};
*/
}
};