双指针专题 就是把前面几个专题的部分使用到双指针的题目进行挑选
27.移除元素
class Solution {
public:int removeElement(vector<int>& nums, int val) {int slowIndex = 0;for(int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {if(val != nums[fastIndex]) {nums[slowIndex++] = nums[fastIndex];}}return slowIndex;}
};
26.删除排序数组中的重复项
class Solution {
public:int removeDuplicates(vector<int>& nums) {int slow = 0;for(int fast = 0; fast < nums.size() - 1; fast++) {if(nums[fast] != nums[fast + 1]) {nums[++slow] = nums[fast + 1];}}return slow + 1;}
};
283,移动零
class Solution {
public:void moveZeroes(vector<int>& nums) {int slow = 0;for(int fast = 0; fast < nums.size(); fast++) {if(0 != nums[fast]) {nums[slow ++] = nums[fast];}}for(int i = slow; i < nums.size(); i++) {nums[i] = 0;}}
};
844.比较含退格的字符串
class Solution {
public:bool backspaceCompare(string s, string t) {int SSkipNum = 0; // 记录s的数量int TSkipNum = 0; // 记录t的数量int i = s.size() - 1;int j = t.size() - 1;while(1) {while(i >= 0) {if(s[i] == '#') SSkipNum++;else {if(SSkipNum > 0) SSkipNum--;else break;}i--;}while(j >= 0) {if(t[j] == '#') TSkipNum++;else {if(TSkipNum > 0) TSkipNum--;else break;}j--;}// 后半部分#消除完了,接下来比较s[i] != t[j]if(i < 0 || j < 0) break; // 遍历到头了if(s[i] != t[j]) return false;i--;j--;}// 说明s和t同时遍历完毕if(i == -1 && j == -1) return true;return false;}
};
977.有序数组的平方
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int left = 0;int right = nums.size() - 1; vector<int> vec(nums.size());int i = nums.size() - 1;while(left <= right) {if(nums[left] * nums[left] > nums[right] * nums[right]) {vec[i--] = nums[left] * nums[left];left++;} else {vec[i--] = nums[right] * nums[right];right--;}}return vec;}
};
344.反转字符串
class Solution {
public:void reverseString(vector<char>& s) {int left = 0;int right = s.size() - 1;while(left < right) {swap(s[left], s[right]);left++;right--;}}
};
替换数字
# include <iostream>
# include <string>
using namespace std;int main() {string s;cin >> s;int front = s.size() - 1;int num = 0;for(int i = 0; i < s.size(); i++) {if(s[i] >= '0' && s[i] <= '9') {num++;}}s.resize(num * 5 + front + 1);int back = s.size() - 1;for(; front < back; back--, front--) {if(s[front] >= '0' && s[front] <= '9') {s[back - 5] = 'n';s[back - 4] = 'u';s[back - 3] = 'm';s[back - 2] = 'b';s[back - 1] = 'e';s[back] = 'r';back -= 5;} else {s[back] = s[front];}}cout << s;}
151.反转字符串里的单词
class Solution {
public:void reverse(string& s, int start, int end) {while(start < end) {swap(s[start], s[end]);start++;end--;}}void removeExtraSpaces(string& s) {int slow = 0;for(int i = 0; i < s.size(); i++) {if(s[i] != ' ') {if(slow > 0) s[slow++] = ' ';while(i < s.size() && s[i] != ' ') {s[slow] = s[i];slow++;i++;}}}s.resize(slow);}string reverseWords(string s) {removeExtraSpaces(s);int start = 0;reverse(s, start, s.size() - 1);for(int i = 0; i <= s.size(); i++) {if(s[i] == ' ' || i == s.size()) {reverse(s, start, i - 1);start = i + 1;}}return s;}
};
19.删除链表的倒数第N个节点
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyHead = new ListNode(0);dummyHead->next = head;ListNode* slow = dummyHead;ListNode* fast = dummyHead;while(n-- && fast != nullptr) {fast = fast->next;}// fast 在提前走一步,需要让slow指向删除节点的上一个节点fast = fast->next;while(fast != nullptr) {fast = fast->next;slow = slow->next;}// 找到倒数第N个节点slow->next = slow->next->next;return dummyHead->next;}
};
链表相交
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode* curA = headA;ListNode* curB = headB;while(curA != curB) {if(curA == NULL) {curA = headB;} else {curA = curA->next;}if(curB == NULL) {curB = headA;} else {curB = curB->next;}}return curA;}
};
142.环形链表II
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* fast = head;ListNode* slow = head;while(fast != NULL && fast->next != NULL) {// 双指针slow = slow->next;fast = fast->next->next;// 快慢指针相遇if(slow == fast) {ListNode* index1 = fast;ListNode* index2 = head;while(index1 != index2) {index1 = index1->next;index2 = index2->next;}return index2;}}return NULL;}
};
15.三数之和
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> result;for(int i = 0; i < nums.size(); i++) {if(nums[i] > 0 && i >= 0) break;if(i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while(left < right) {if(nums[i] + nums[left] + nums[right] > 0) right--;else if(nums[i] + nums[left] + nums[right] < 0) left++;else {result.push_back(vector<int>{nums[i], nums[left], nums[right]});while(left < right && nums[left] == nums[left + 1]) left++;while(left < right && nums[right] == nums[right - 1]) right--;left++;right--;}}}return result;}
};
10.四数之和
class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(), nums.end());vector<vector<int>> vec;for(int i = 0; i < nums.size(); i++) {if(nums[i] >= 0 && nums[i] > target) {break;}if(i > 0 && nums[i] == nums[i - 1]) {continue;}for(int j = i + 1; j < nums.size(); j++) {if(nums[i] + nums[j] >= 0 && nums[i] + nums[j] > target) {break;}if(j > i + 1 && nums[j] == nums[j - 1]) {continue;}int left = j + 1;int right = nums.size() - 1;while(left < right) {if((long) nums[i] + nums[j] + nums[left] + nums[right] > target) right--;else if((long) nums[i] + nums[j] + nums[left] + nums[right] < target) left++;else {vec.push_back(vector<int>{nums[i], nums[j], nums[left], nums[right]});while(left < right && nums[left] == nums[left + 1]) left++;while(left < right && nums[right] == nums[right - 1]) right--;left++;right--;}}}}return vec;}
};
明天开始HOT100
坚持每天3道HoT100 + 复盘随想录的栈和队列专题
冲!!!
争取三天把项目复盘完!