class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left=0,right=0;
for(;right<nums.size();right++){
if(nums[right]!=val){
nums[left]=nums[right];
left++;
}
}
return left;
}
};
这个核心思路就是即使被删除,那么left还是来源于right,就不用移动删除了
2.26. 删除有序数组中的重复项 - 力扣(LeetCode)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int target=nums[0];
int left=1,right=0;
for(;right<nums.size();right++){
if(nums[right]==target){
continue;
}
else{
target=nums[right];
nums[left++]=nums[right];
}
}
return left;
}
};
left=1用来存储第一个元素
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int left=0,right=0;//left表示已经处理好的序列的尾部,right表示待处理的头部
int n=nums.size();
if(n==1){
return ;
}
for(;right<nums.size();right++){
if(nums[right]!=0){
nums[left++]=nums[right];
}
}
while(left<nums.size()){
nums[left++]=0;
}
return ;
}
};
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int>ans;
int i=0;
//1.找到分界点
for(;i<nums.size();i++){
if(nums[i]>=0){
break;
}
}
//2.从两端开始收敛
int left=i-1,right=i;
int count=nums.size();
while(count && left>=0 && right<nums.size()){
if(nums[right]<-nums[left]){
ans.push_back(nums[right]*nums[right]);
right++;
}
else{
ans.push_back(nums[left]*nums[left]);
left--;
}
count--;
}
//3.如果一边到达了终点
while(left>=0){
ans.push_back(nums[left]*nums[left]);
left--;
}
while(right<nums.size()){
ans.push_back(nums[right]*nums[right]);
right++;
}
//4.返回结果
return ans;
}
};
5.844. 比较含退格的字符串 - 力扣(LeetCode)
class Solution {
public:
bool backspaceCompare(string s, string t) {
//1.初始化指针
int a=s.size()-1,b=t.size()-1;
int cnt_s=0,cnt_t=0;
//2.处理字符串,只要字符串大于零就处理
while(a>=0 || b>=0){
//处理s串
while(a>=0){
if(s[a]=='#'){
cnt_s++;
a--;
}else if(cnt_s>0){
cnt_s--;
a--;
}else{
break;
}
}
while(b>=0){
if(t[b]=='#'){
cnt_t++;
b--;
}else if(cnt_t>0){
cnt_t--;
b--;
}else{
break;
}
}
if (a>=0 && b>=0){
if(s[a]!=t[b]){
return false;
}else{
a--;
b--;
}
}else if(a>=0||b>=0){
return false;
}
}
return true;
}
};