文章目录
明天面试拼多多,因为今天面华为遇到了一个做过的题目,没做出来,关键是这个题目第一次做出来了,这次居然没有做出来,比较烦,所以今天就是尽可能复习多个题目
复习
最大考试困扰度
- 滑动窗口+双指针+问题拆分
- 分析链接
cpp
class Solution {
public:
int maxConsecutiveAnswers1(string s,int k ,char c){
int res = 0,num = 0;
for(int l = 0,r = 0;r < s.size();r ++){
if(s[r] != c) num ++;
while(num > k){
// 移动左指针,保证num小于k
if(s[l] != c) num --;
l ++;
}
res = max(res,r - l + 1);
}
return res;
}
int maxConsecutiveAnswers(string s,int k){
return max(maxConsecutiveAnswers1(s,k,'F'),
maxConsecutiveAnswers1(s,k,'T')
);
}
};
三数之和------做的不好
- 双指针,枚举左右两个指针
- 出现了一个问题,并不知道怎么去除重复了。
- 这次出现了两个问题
- 首先对于i的最左侧的指针进行去重,必须要保证是i-1,是和上一个相同,和下一个相同就跳过,出现1,1,0,-2连续两个相邻的元素没有遍历到
- 双指针应该是y小于k,所以这里做的也不对,变成了y<size
cpp
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
for(int i = 0;i <= nums.size();i ++){
if(i && nums[i - 1] == nums[i]) continue;
for(int j = i + 1,k = nums.size() - 1;j < nums.size();j++){
//for(int j = i + 1,k = nums.size() - 1;j < k;j++){
if(k-1 > j && nums[i] + nums[j] + nums[k - 1] >= 0) k --;
if(nums[i] + nums[j] + nums[k] == 0 )
res.push_back({nums[i] , nums[j] , nums[k]});
}
}
return res;
}
};
还有其他的一些题目,这里为了省时间,直接过的,没有记录
新作
环形链表
- 这道题使用的是快慢指针,速度差一,所以如果说存在环的情况下,一定会追上彼此的,如果遍历相等的话,就是表示存在环。
实现代码
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *h) {
if(!h || !h->next) return false;
auto s = h,f = h->next;
while(f){
s = s->next,f = f->next;
if(!f) return false;
f = f->next;
if(f == s) return true;
}
return false;
}
};