LeetCode 242. 有效字母的异位词
解题思路
本题是要统计两个字符串出现的每个字母数量是否都相同。 由于字母只有26个,可以选择用数组做存储。因为字符a到字符z的ASC|| 是 26个连续的值, 所以字符a映射为下标0, 相应的字符z映射为下标25。
代码解析
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size())
return false;
int table[26] = {0};
for(int i = 0; i<s.size(); i++)
{
int temp = s[i] - 'a';
int temp1 = t[i] - 'a';
table[temp]++;
table[temp1]--;
}
for(int i=0; i<26; i++)
{
if(table[i] !=0)
return false;
}
return true;
}
};
LeetCode 349. 两个数组的交集
解题思路
输出结果中的每个元素一定是唯一的,也就是说输出的结果要去重。如果简单的用暴力法进行遍历,要是nums2中出现重复值,就没法排除。
如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间极大的浪费。unordered_set 的 读写效率是最高的,并不需要对数据进行排序,而且可以让数据不重复。
这里需要掌握unordered_set 与vector 转化的方法。
unordered_set<int> result_set;
// 插值
result_set.insert(1);
// 转化为vector
vector<int>(result.begin(), result.end());
代码解析
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());
}
};
LeetCode 202. 快乐数
解题思路
快乐数是指:将正整数上的每个位置上的数字进行平方求和,如果这个数不是1,就重复上述操作直到这个数变成1。如果陷入无限循环,则说明这个不是快乐数。
该题的第一个核心是要完成平方求和的操作,就是利用整除10 以及整除10取余操作。
第二个要抓住“无限循环”这一关键点,如果出现之前的数 说明再循环也不会出现1了,那就可以直接退出该循环。所以在循环过程中要将这些中间值进行记录。
代码解析
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;
}
// 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
if (set.find(sum) != set.end()) {
return false;
} else {
set.insert(sum);
}
n = sum;
}
}
};
LeetCode 1. 两数之和
解题思路
本题不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用key value 结构
来存放,key存放元素,value存放下标。这个就可以使用map(感觉可以类比python 里的字典)。
map的一些标准用法如下:
// 初始化map
unordered_map <int, int> map;
// 在map中寻找是否有匹配的key
// 注意返回的是指针(key, value)结构
auto iter = map.find('key');
// 访问指针结构中的value值
iter->second;
// 访问指针结构中的key值
iter->first;
// map中插入元素(1,2)
map.insert(pair<int, int>(1,2));
代码解析
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
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 {};
}
};