文档讲解:代码随想录
242.有效的字母异位词
题目链接:https://leetcode.cn/problems/valid-anagram/
思路:
以数组为hash表即可,因为小写字母只有26个,hash函数可直接使用字母在26个字母中的顺序,如a为0。
统计两个数组的hash表进行对比即可,或者第一个的加到hash表,第二个的减掉,统计hash表中的值最终是否为0即可。
核心代码:
class Solution {
public:
bool isAnagram(string s, string t) {
int a[30];
bool flag=true;
memset(a,0,sizeof(a));
int l=s.length();
for(int i=0;i<l;i++) a[(s[i]-'a')]++;
l=t.length();
for(int i=0;i<l;i++) a[(t[i]-'a')]--;
for(int i=0;i<26;i++){
if(a[i]!=0){
flag=false;
break;
}
}
return flag;
}
};
349.两个数组的交集
题目链接:https://leetcode.cn/problems/intersection-of-two-arrays/
思路:
本题目非常简单,首先用map统计第一个数组的值。然后对第二个数组中的每个值进行检查,如果在map中存在,证明为交集,加入结果数组即可。过程中注意去重。
核心代码:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> map;
vector<int> ans;
for(auto it : nums1) {
map.emplace(it, 0);
}
for(auto it : nums2) {
if(map.contains(it) && map[it] == 0)
{
ans.push_back(it);
map[it] = 1;
}
}
return ans;
}
};
202.快乐数
题目链接:https://leetcode.cn/problems/happy-number/
思路:
本题目也很简单,因为每次计算可能出现的两种情况题面中都告诉我们了。
当计算出1的时候证明计算结束,退出循环即可。
其他情况就是陷入循环,那么就说明我们会重复计算出某些值。我们可以开map或者set进行统计,计算出一个值就进行判断,如果已经在map或者set中存在,那么证明陷入循环,否则就加入map或者set中接着向下计算。
核心代码:
class Solution {
public:
int calc(int n){
int sum=0;
while(n){
sum+=(n%10)*(n%10);
n/=10;
}
return sum;
}
bool isHappy(int n) {
int sum=0;
unordered_set<int> cnt;
while(true){
sum=calc(n);
if(sum==1) return true;
if(cnt.find(sum)!=cnt.end()) return false;
else cnt.insert(sum);
n=sum;
}
}
};
1.两数之和
题目链接:https://leetcode.cn/problems/two-sum/
思路:
本题目也很简单,利用set或map统计,其实这题最好还是用map,方便连下标一起统计着。
然后枚举每个值,判断这个值和(目标值target-这个值)是否都在map中即可。如果都在,则找到了答案。
核心代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;
vector<int> ans(2,-1);
int n=nums.size();
for(int i=0;i<n;i++)
{
if(a.count(target-nums[i])>0)
{
ans[0]=a[target-nums[i]];
ans[1]=i;
break;
}
a[nums[i]]=i;
}
return ans;
}
};
今日总结
今日学习时长3h,做题手感变好,今天的题也简单些,主要得熟悉STL的应用和基本的hash知识。
今天写的简单些,最近有期末报告得去忙,可能思路都会简写。