前言
一个本硕双非的小菜鸡,备战24年秋招,计划刷完卡子哥的刷题计划,加油!
推荐一手卡子哥的刷题网站,感谢卡子哥。代码随想录
一、27.移除元素
力扣27移除元素
Note:快慢指针的经典题目
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
int fastIndex = 0;
for (fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};
二、26. 删除有序数组中的重复项
Note:属于快慢指针的一种变种,需要小改一下。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int slowIndex = 1;
int fastIndex = 1;
if (nums.size() == 0) {
return 0;
}
for (fastIndex = 1; fastIndex < nums.size(); fastIndex++) {
if (nums[fastIndex] != nums[fastIndex - 1]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};
三、283. 移动零
Note:属于快慢指针的一种变种,需要小改一下。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slowIndex = 0;
int fastIndex = 0;
for (fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (nums[fastIndex] != 0) {
swap (nums[slowIndex], nums[fastIndex]);
slowIndex++;
}
}
}
};
四、844. 比较含退格的字符串
Note:虽然是一道简单题,但我感觉跟中等差不多,思路要清晰。
class Solution {
public:
bool backspaceCompare(string s, string t) {
int fastIndex = s.size() - 1;
int slowIndex = t.size() - 1;
int sNumber = 0;
int tNumber = 0;
while (1) {
while (fastIndex >= 0) {
if (s[fastIndex] == '#') sNumber++;
else {
if (sNumber > 0) sNumber--;
else break;
}
fastIndex--;
}
while (slowIndex >= 0) {
if (t[slowIndex] == '#') tNumber++;
else {
if (tNumber > 0) tNumber--;
else break;
}
slowIndex--;
}
if (fastIndex < 0 || slowIndex < 0) break;
if (s[fastIndex] != t[slowIndex]) return false;
fastIndex--;
slowIndex--;
}
if (fastIndex == -1 && slowIndex == -1) return true;
return false;
}
};
总结
双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。