一、经验总结
二、相关编程题
2.1 两数之和
题目链接
题目描述
算法原理
编写代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
hash[nums[0]] = 0;
for(int i = 1; i < nums.size(); ++i)
{
int k = target-nums[i];
if(hash.count(k))
return {i, hash[k]};
else
hash[nums[i]] = i;
}
return {-1, -1};
}
};
2.2 判定是否互为字符重排
题目链接
面试题 01.02. 判定是否互为字符重排 - 力扣(LeetCode)
题目描述
算法原理
编写代码
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if(s1.size() != s2.size()) return false;
int hash[26] = {0};
for(auto ch : s1)
++hash[ch-'a'];
for(auto ch : s2)
{
--hash[ch-'a'];
if(hash[ch-'a'] < 0)
return false;
}
return true;
}
};
2.3 存在重复元素Ⅰ
题目链接
题目描述
算法原理
略
编写代码
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> hash;
for(int e : nums)
{
if(hash.count(e))
return true;
else
hash.insert(e);
}
return false;
}
};
2.4 存在重复元素Ⅱ
题目链接
题目描述
算法原理
略
编写代码
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> hash;
for(int i = 0; i < nums.size(); ++i)
{
if(hash.count(nums[i]) && i-hash[nums[i]]<=k)
return true;
hash[nums[i]] = i;
}
return false;
}
};
2.5 字母异位词分组
题目链接
题目描述
算法原理
编写代码
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> hash;
//将所有的字母异位词分组
for(string &str : strs)
{
string key = str;
sort(key.begin(), key.end());
hash[key].push_back(str);
}
//将分组后的结果提取出来
vector<vector<string>> ret;
for(auto &[x,y] : hash) //注意这个语法
{
ret.push_back(y);
}
return ret;
}
};