文章目录
一、1512. 好数对的数目
1.原题链接
2.题目描述
给你一个整数数组 nums 。如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。返回好数对的数目。
3.解题思路
运用哈希表,遍历数组,找到满足条件的次数存入ans即可。
4.源码
class Solution {
public:
int numIdenticalPairs(vector<int>& nums) {
int ans=0;
int hash[101];
memset(hash,0,sizeof(hash));
for(int i=0;i<nums.size();++i){
ans+=hash[nums[i]];
++hash[nums[i]];
}
return ans;
}
};
二、2006. 差的绝对值为 K 的数对数目
1.原题链接
2.题目描述
给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。|x| 的值定义为:如果 x >= 0 ,那么值为 x 。 如果 x < 0 ,那么值为 -x 。
3.解题思路
本题与上题类似,也是运用哈希表,注意要找两次。
4.源码
class Solution {
public:
int countKDifference(vector<int>& nums, int k) {
unordered_map<int,int> hash;
int ans =0;
for(int i =0;i<nums.size();++i){
ans+=hash[nums[i]+k];
ans+=hash[nums[i]-k];
hash[nums[i]]++;
}
return ans;
}
};
三、1347. 制造字母异位词的最小步骤数
1.原题链接
2.题目描述
给你两个长度相等的字符串 s 和 t。每一个步骤中,你可以选择将 t 中的 任一字符 替换为 另一个字符。返回使 t 成为 s 的字母异位词的最小步骤数。字母异位词 指字母相同,但排列不同(也可能相同)的字符串。
3.解题思路
构造两个哈希表,遍历两个字符串,将其存入哈希表中,之后枚举每个字母,并进行比较,如果两个差值为正数,则累加。
4.源码
class Solution {
public:
int minSteps(string s, string t) {
int hashs[256];
int hasht[256];
int ans =0;
memset(hashs,0,sizeof(hashs));
memset(hasht,0,sizeof(hasht));
for(int i =0;i<s.size();++i){
++hashs[s[i]];
++hasht[t[i]];
}
for(int i ='a';i<='z';++i){
if(hasht[i]-hashs[i]>0){
ans+=hasht[i]-hashs[i];
}
}
return ans;
}
};
四、面试题 10.02. 变位词组
1.原题链接
2.题目描述
编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。
3.解题思路
遍历strs的每个字符,按照字典序排序,之后插入到哈希表中,之后遍历哈希表,将原数组变为二维数组。
4.源码
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>> hash;
for(int i=0;i<strs.size();++i){
string s =strs[i];
sort(s.begin(),s.end());
hash[s].push_back(strs[i]);
}
vector<vector<string>> ans;
for(auto i :hash){
ans.push_back(i.second);
}
return ans;
}
};
ps:本题与49. 字母异位词分组 相同,做一题过两题。
总结
第七天辣,还需加油。