双指针(1)

发布时间 2024-01-11 11:47:54作者: LiviaYu

344反转字符串

我如果要反转,就是最前面和最后面的字符进行交换,

//双指针的应用
class Solution {
public:
    void reverseString(vector<char>& s) {
        int left=0,right=s.size()-1;
        while(left<right)
        {
            char temp=s[left];
            s[left]=s[right];
            s[right]=temp;
            left++;
            right--;
        }
    }
};

替换数字

#include<bits/stdc++.h>

using namespace std;

//第一思路,遇到数字就塞一个number进去?
string solutionA(string s)
{
    string ans;
    
    int n=s.length();
    
    for(int i=0;i<n;i++)
    {
        if(isdigit(s[i]))
        {
            ans+="number";
        }
        else
        {
            ans+=s[i];
        }
    }
    return ans;
}

//如果原地呢?就在有数字的位置插入一个number
void solutionB(string& s)
{
    int i=0;
    while(i<s.length())
    {
        if(isdigit(s[i]))
        {
            s.replace(i,1,"number");
            i+=5;
        }
        i++;
    }
    
}

int main()
{
    string s;
    
    cin>> s;
    
    solutionB(s);
    
    cout<< s;
    
    return 0;
    
}

反转单词

  1. 第一思路,从后向前双指针,遇到space就说明一个字符结束了,然后把这个字符拷贝到ans里面,并加上一个space,最后再去掉最后的space就可以了
  2. 别人的思路:先反转整个string,然后再逐个反转单词这里需要
  • 移除空格,这里没掌握好移除元素的精髓,竟然想了半天都没想到双指针移除
  • 反转单词,这个比较简单
class Solution {
public:
    //第一思路,从后向前双指针,遇到space就说明一个字符结束了,然后把这个字符拷贝到
    //ans里面,并加上一个space,最后再去掉最后的space就可以了
    string solutionA(string s)
    {
        string ans;
        for(int n=s.length()-1;n>=0;n--)
        {
            if(s[n]==' ')
            {
                continue;
            }
            else{
                int i=n;
                while(i>=0&&s[i]!=' ')
                {
                    i--;
                }
                ans+=s.substr(i+1, n-i);
                ans+=' ';
                n=i;
            }
        }
        ans.erase(ans.length()-1);
        return ans;
    }
    //第二方法
    //类似27移除元素,感觉掌握的还是不够好啊,竟然没想到双指针
    void removeSpace(string & s)
    {
        int slowptr=0;
        int fastptr=0;
        while(s[fastptr]==' ')
        {
            fastptr++;
        }
        for(;fastptr<s.length();fastptr++)
        {
            if(s[fastptr]==' '&&s[fastptr-1]==s[fastptr])
            {
                continue;
            }
            else
            {
                s[slowptr]=s[fastptr];
                slowptr++;
            }
        }
        s.resize(slowptr);
        if(*(s.end()-1)==' ')
        {
            s.resize(s.length()-1);
        }
        
    }
    void reverse(string & s,int start,int end)
    {
        while(start<end)
        {
            swap(s[start],s[end]);
            start++;
            end--;
        }
    }
    string solutionB(string& s)
    {
        removeSpace(s);
        std::reverse(s.begin(),s.end());
        int start=0;
        int end=0;

        for(;end<s.length();end++)
        {
            while(end<s.length()&&s[end]!=' ')
            {
                end++;
            }
            reverse(s,start,end-1);
            start=end+1;
        }
        return s;
    }

    
    //空间O(1)
    string reverseWords(string s) {
        return solutionB(s);
    }
};