27. 移除元素
题目链接
题解:快慢指针。因为数组的地址是连续的,不可以单独删除数组中的某个元素,因此考虑在数组中移动元素然后对有效位计数。快指针遍历数组,慢指针遇到target则开启元素移动。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast=0,slow=0;
for(fast=0;fast<nums.size();fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
26. 删除有序数组中的重复项
题目链接
题解:首先是有序数组,那么重复项一定是相邻的。其次心里一定要有双指针移动的动画,本质还是元素移动交换。把握数量关系,nums[fast+1]==nums[fast]则继续前进,nums[fast+1]!=nums[fast]则做交换。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0) return 0;
int slow=0,fast=0;
for(fast=0;fast<nums.size()-1;fast++){
if(nums[fast+1]!=nums[fast]){
slow++;
nums[slow]=nums[fast+1];
}
}
return slow+1;
}
};
283. 移动零
题目链接
题解:同样是快慢指针,遇到零则交换,而不是取代。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slow=0,fast=0;
int temp;
for(fast=0;fast<nums.size();fast++){
if(nums[slow]==0){
if(nums[fast]!=0){
temp=nums[slow];
nums[slow]=nums[fast];
nums[fast]=temp;
slow++;
}
}
if(nums[slow]!=0) slow++;
}
}
};
844. 比较含退格的字符串
题目链接
题解:用栈的方法比较好理解。这里用字符串来模拟栈,进栈直接+,出栈用pop_back()函数,这里要熟知string的常用函数。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast=0,slow=0;
for(fast=0;fast<nums.size();fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
也可以用双指针的方法来解决,但是最后的比对字符串部分比较复杂,要考虑很多种情况。
class Solution {
public:
bool backspaceCompare(string s, string t) {
int S=s.size()-1;
int T=t.size()-1;
int snum=0,tnum=0;
while(S>=0||T>=0)
{
while(S>=0){
if(s[S]=='#') {
snum++;
S--;
}
else if(snum>0){
snum--;
S--;
}
else {break;}
}
while(T>=0){
if(t[T]=='#'){
tnum++;
T--;
}else if(tnum>0){
tnum--;
T--;
}else {break;}
}
// 后半部分#消除完了,接下来比较S[i] != T[j]
if (S < 0 || T < 0) break; // S 或者T 遍历到头了
if (s[S] != t[T]) return false;
S--;T--;
}
// 说明S和T同时遍历完毕
if (S == -1 && T == -1) return true;
return false;
}
};
977. 有序数组的平方
题目链接
题解:新开一个和原数组一样大小的数组用来存放结果。一共两种情况,一种是所有数字都大于等于零,则不存在数组以移位情况直接平方输出。第二种情况就是nums的两头为正负数,则可能存在负数平方后需要移动到数组后方,采用双指针,从两头开始往中间找,因为两头最大中间小。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
if(nums[0]>=0){
for(int i=0;i<nums.size();i++){
nums[i]=nums[i]*nums[i];
}
return nums;
}
int i=0;
int j=nums.size()-1;
int k=nums.size()-1;
vector<int> result(nums.size(),0);
while(j>=i){
if(nums[i]*nums[i]>nums[j]*nums[j]){
result[k--]=nums[i]*nums[i];
i++;
}else{
result[k--]=nums[j]*nums[j];
j--;
}
}
return result;
}
};