题1:
指路:LeetCode242 有效的字母异位词
思路与代码:
1.排序:
判断两个字符串里面的内容是否无次序相同,小写字母排列。我们可以考虑采取排序的方法,分别将两个字符串排序再返回判断两者相等的结果,代码如下:
class Solution {
public:
bool isAnagram(string s, string t) {
//排序
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
};
好像这么做实在没什么技术含量,那么我们可以考虑哈希。
2.哈希:
哈希作为快速判断元素是否出现在集合里是一种强大的存在。在这里的题目中,只有26个小写字母,对于可以掌控的我们用数组即可。定义一个长度为26的数组用来存放26个英文字母,让数组s里面的内容映射在哈希表上,按照次数自增;这样就统计完了数组s中的字母次数,接下来只需判断数组t中的字母次数是否与数组s中的一样即可。这里我们让数组t同样映射在哈希表上按照次数自减,最后如果哈希表中所有值都等于0则证明两个数组中的内容无序基础上相同。代码如下:
class Solution {
public:
bool isAnagram(string s, string t) {
//排序
int has[26];
for (int i = 0; i < s.size(); i++)
has[s[i] - 'a']++;
for (int i = 0; i < t.size(); i++)
has[t[i] - 'a']--;
for (int i = 0; i < 26; i++) {
if (has[i] != 0)
return false;
}
return true;
}
};
题2:
指路: LeetCode349 两个数组的交集
思路与代码:
求两个数组的交集我们可以将其中一个做成哈希表,遍历另一个数组看其是否在哈希表中出现过。这里我们哈希表的数据结构选择unordered set自动去重且取值映射效率高。代码如下:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//set
unordered_set<int> result; //符合条件的放进来
unordered_set<int> nums_set(nums1.begin(), nums1.end()); // 将nums1处理成哈希表
for (int i = 0; i < nums2.size(); i++) {
if (nums_set.find(nums2[i]) != nums_set.end())
//nums2里在nums_set中出现的值
result.insert(nums2[i]); // 将这个元素添加到自动去重的result中
}
return vector<int>(result.begin(), result.end());
}
};
题3:
指路:LeetCode202 快乐数
思路与代码:
很显然我们需要先写一个求和函数得到n的数位平方和,注意在接下去的情况中如果出现循环返回false。代码如下:
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> ans; // 不重复集合
while (1) {
int sum = getsum(n); // 得到和
if (sum == 1) return true;
if (ans.find(sum) != ans.end()) // 出现过,已经开始循环
return false;
else
ans.insert(sum); // 没出现过,放进集合
n = sum;
}
}
};
题4:
指路:LeetCode1 两数之和
思路与代码:
用map存储值和位置,将已经遍历过的数放入map再去找和数值匹配的数是否在map中出现过。是则返回下标,否则将它存入map继续遍历后面的数。代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unondered_map(int, int) map;
for (int i = 0; i < nums.size(); i++) {
auto iter = map(find(target - nums[i])); // 找到符合条件的一对中的另一个数
if (iter != map.end()) // 在map里出现了
return {iter->second, i};
}
map.insert(nums[i], i); // 没在已经遍历过的里面找到配对值就把它加到map中
}
return {}; // 否则输出空
};