242.有效的字母异位词
先贴我的代码:
bool isAnagram(string s, string t) {
vector<int> box(26, 0);
for(char c : s){
box[c - 'a']++;
}
for(char c : t){
box[c - 'a']--;
}
for(int i = 0; i < box.size(); i++){
if(box[i] != 0) return false;
}
return true;
}
心得:
就直接用数组来存储字符串的值,再拿另外一个需要匹配的进行相减,如果相减之后数组内部存在不为 0 的项,说明俩个不相等。
349. 两个数组的交集
我的代码:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> r;
unordered_set<int> res;
unordered_set<int> box(nums1.begin(),nums1.end());
for(int a : nums2){
if(box.count(a)){
res.emplace(a);
}
}
for(auto iter = res.begin(); iter != res.end(); iter++){
r.push_back(*iter);
}
return r;
}
做题心得:
关于 set 初始化可以按照如上代码中初始化,便捷,通过传入数组的边界信息初始化。其次需要理清楚 set 的原理,尤其是unordered_set,举个例子就是 [2,2,3,4,2],存进 set 里就是 [2,3,4] 不会有重复元素。
以及我最后遍历 iter 的时候,我忘了iter其实是个指针,得需要 *iter 取值。
202. 快乐数
我的代码:
int getSum(int n){
int sum = 0;
while(n){
sum += (n % 10) * (n % 10);
n = n / 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> box;
while(1){
int sum = getSum(n);
if(sum == 1) return true;
if(box.count(sum)){
return false;
}else{
box.emplace(sum);
}
n = sum;
}
return false;
}
做题心得:
要搞清 % 和 / :
%10: 取余获得个位数的值
/10: 取商获得去除个位数后的值
根据快乐数的定义,题目明说了如果不是快乐数会导致数据循环,无尽循环,这样我只要通过设置一个 unordered_set 来确保每次保存计算的值,然后只要在某次计算中存在循环,那就可以直接说明不是快乐数。
1. 两数之和
我的代码:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> res;
unordered_map<int,int> box;
for(int i = 0; i < nums.size(); i++){
int value = target - nums[i];
if(box.find(value) != box.end()){
res.push_back(i);
res.push_back(box[value]);
}else{
box[nums[i]] = i;
}
}
return res;
}
做题心得:
box里 first 定义为 nums 里的值, second 用以存储 nums 的下标。且 find 和 count 都是对 key 进行操作。
box[key] = value 可以这么赋值,或者可以使用 box.insert(pair<int,int>{key, value}) 来进行存储。