前言
这里记录一下陈菜菜的刷题记录,主要应对25秋招、春招
个人背景
211CS本+CUHK计算机相关硕,一年车企软件开发经验
代码能力:有待提高
常用语言:C++
系列文章目录
第一天 数组 part01
第二天 数组 part02
第三天 链表 part01
第四天 链表 part02
第五天 休息
第六天 哈希表 part01
`
文章目录
一、今日任务
● 哈希表理论基础
● 242.有效的字母异位词
● 349. 两个数组的交集
● 202. 快乐数
● 1. 两数之和
二、详细布置
哈希表基础知识
242.有效的字母异位词
题目链接:力扣242
文章讲解:代码随想录-有效的字母异位词
视频讲解:代码随想录
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
提示:
1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母
样例1:
输入: s = "anagram", t = "nagaram"
输出: true
样例2:
输入: s = "rat", t = "car"
输出: false
思路
这题一眼看就是字母数组,统计每个字符串中各个字母的个数的变形。
实战
class Solution {
public:
bool isAnagram(string s, string t) {
int ss[26]={0},tt[26]={0};
int i;
for(i=0;s[i]!='\0';i++){
ss[s[i]-'a']++;
}
for(i=0;t[i]!='\0';i++){
tt[t[i]-'a']++;
}
for(i=0;i<26;i++){
if(ss[i]!=tt[i])
return false;
}
return true;
}
};
349. 两个数组的交集
给定两个数组 nums1 和 nums2,返回它们的交集输出结果中的每个元素一定是唯一 的我们可以不考虑输出结果的顺序 。
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
样例1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
样例2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
思路
这题使用unorderset处理,对于重复数据过筛。再把第二个数组中的每个元素和set里的数比较,找得到说明是公共元素,留下。
实战
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> re;
unordered_set<int> n(nums1.begin(),nums1.end());
for(auto i:nums2){
auto b=n.find(i);
if(b!=n.end())
re.insert(i);
}
vector<int> result(re.begin(),re.end());
return result;
}
};
踩坑
最后要把set的数据赋值到vector里,这步卡了半天。。。后来发现STL真好用啊!!
202. 快乐数
题目描述
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
提示:
1 <= n <= 2^31 - 1
样例1:
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
样例2:
输入:n = 2
输出:false
思路
这题思路之前一直搞不懂,一点都不快乐。。。。
后来看了讲解,不快乐数就是有循环的,那直接用set就可以解决了。
这题码一下,下次可以继续做。
实战
class Solution {
public:
int sumofnum(int num){
int sum=0;
while(num){
sum+=pow(num%10,2);
num/=10;
}
return sum;
}
bool isHappy(int n) {
int sum;
unordered_set<int> myset;
while(1){
sum=sumofnum(n);
if(sum==1)
return true;
if (myset.find(sum) != myset.end()) {
return false;
} else {
myset.insert(sum);
}
n=sum;
}
}
};
踩坑
1.最后返回的是指针,不是val。不相交的话返回null就行。
1. 两数之和
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
样例1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
样例2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
样例3:
输入:nums = [3,3], target = 6
输出:[0,1]
思路
这题是力扣的第一题,梦开始的地方。但是用哈希表的方式这是第一次做。
实战
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map <int,int> mymap;
for(int i=0;i<nums.size();i++){
auto it = mymap.find(target - nums[i]);
if(it != mymap.end()){
return {it->second, i};
}
else
mymap.insert(pair<int, int>{nums[i],i});
}
return {};
}
};
踩坑
1.最后返回的是pair键值对
2.没有符合条件的话返回{}就行。
总结
今天主要学习了哈希表的一系列操作,复习了一下set,map还有STL的用法!受益颇多!继续加油!
加油,坚持打卡的第六天。