2024.9.1
**每日一题**
1450.在既定时间做作业的学生人数,这是一道简单的模拟题,我们只需要判断每个学生的作业时间是否包含询问时间即可,具体判断方法为开始时间小于等于访问时间,结束时间大于等于访问时间。
class Solution {
public:
int busyStudent(vector<int>& startTime, vector<int>& endTime, int queryTime) {
int ans = 0;
int n = startTime.size();
for(int i = 0;i<n;i++){
if(startTime[i]<=queryTime&&endTime[i]>=queryTime){
ans++;
}
}
return ans;
}
};
49.字母异位词分组,这道题是一个考察哈希表的题目,我们需要统计每一个单词中字母的出现情况,并且将字母情况相同的放在同一个组合里。这里我们利用了c++20的新特性,ranges::sort,这个表示将字符串按指定规则排序,我们对每一个字符串先生成一个副本然后进行排序,如果排序后的结果相同我们就放到同一个vector里面。最后输出时需要新建一个数组,将原来哈希表的值全部加进数组里面再输出。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>> m;
for(auto &s : strs){
string sorted_s = s;
ranges::sort(sorted_s);
m[sorted_s].push_back(s);
}
vector<vector<string>> ans;
ans.reserve(m.size());
for(auto &[_,value] : m) {
ans.push_back(value);
}
return ans;
}
};
128.最长连续序列,这道题考察的是哈希表和数组的相关知识。对于题目给出的未排序的数组,可能出现重复的情况,所以我们首先需要将数组中的元素都放进一个哈希集合里面来去重。然后对于哈希集合里面的每一个数,我们需要判断两种情况,第一种是这个数可以作为序列的开头,第二种是不能作为序列的开头,判断标准为这个数-1是否存在。如果可以作为序列的开头,那么以这个数为当前数,不断地寻找比这个数大1的数是否存在,如果存在就继续遍历,并且维护一个以当前数为开头的序列长度。当无法继续遍历的时候,更新答案的最长序列。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> nums_set;
for(const int& num : nums){
nums_set.insert(num);
}
int ans = 0;
for(const int& num : nums_set){
if(!nums_set.count(num-1)){
int cnt = num;
int cntlen = 1;
while(nums_set.count(cnt+1)){
cnt++;
cntlen++;
}
ans = max(ans,cntlen);
}
}
return ans;
}
};
56.合并区间,这道题考察的是数组和排序的相关知识,根据题意,我们需要将区间重合的数组先合并再插入到答案数组中,那么我们自然想到,当数组中的元素左端点越小时,越有可能被合并,所以我们先按左端点排序。然后遍历每一个时间区间,第一个直接加入,然后对于后续每一个我们需要判断答案数组最后一个区间的右端点是否大于等于新区间的左端点,如果符合那么就更新答案数组的最后一个元素的右端点为新元素的右端点,代表区间被延长了。反之,如果没有包含,那么就直接将新区间加入到答案数组中。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
ranges::sort(intervals);
vector<vector<int>> ans;
for (auto& p : intervals) {
if(!ans.empty()&&p[0]<=ans.back()[1]){
ans.back()[1]=max(ans.back()[1],p[1]);
}
else{
ans.emplace_back(p);
}
}
return ans;
}
};
**周赛**
Q1.检查棋盘方格颜色是否相同,这道题是一个简单的数学题,我们可以观察出,当棋盘行和列的奇偶性相同时,则为黑色, 否则为白色,那么我们就可以通过两个坐标来判断奇偶性了,字符要先转为ascll码。
class Solution {
public:
bool checkTwoChessboards(string coordinate1, string coordinate2) {
int num11 = (coordinate1[0]-'0')%2;
int num12 = ((int)coordinate1[1])%2;
int num1 = 0;
if(num11==num12){
num1 = 1;
}
else num1 = 0;
int num21 = (coordinate2[0]-'0')%2;
int num22 = ((int)coordinate2[1])%2;
int num2 = 0;
if(num21==num22){
num2 = 1;
}
else num2 = 0;
if(num1==num2){
return true;
}
else return false;
}
};