Bootstrap

第五天 字符串

1. 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出

简单的双指针的应用

class Solution {
public:
    void reverseString(vector<char>& s) {
        for(int i=0,j=s.size()-1;i<j;i++,j--)
            swap(s[i],s[j]);
    }
};

2.反转字符串II

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

题目重点在于要确定书写方式 一定不能思路混乱

class Solution {
public:
    string reverseStr(string s, int k) {//左闭右开规则
        for(int i=0;i<s.size();i+=2*k)
        {
            if(i+k<s.size())
                reverse(s.begin()+i,s.begin()+i+k);
            else
                reverse(s.begin()+i,s.end());
        }
        return s;
    }
};

3.替换数字

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number

注意:很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作

#include<iostream>
using namespace std;
int main() {
    string s;
    cin >> s;
        int count = 0; // 统计数字的个数
        int sOldSize = s.size();
        for (int i = 0; i < s.size(); i++) {
            if (s[i] >= '0' && s[i] <= '9') {
                count++;
            }
        }
        // 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
        s.resize(s.size() + count * 5);
        int sNewSize = s.size();
        // 从后先前将空格替换为"number"
        for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
            if (s[j] > '9' || s[j] < '0') {
                s[i] = s[j];
            } else {
                s[i] = 'r';
                s[i - 1] = 'e';
                s[i - 2] = 'b';
                s[i - 3] = 'm';
                s[i - 4] = 'u';
                s[i - 5] = 'n';
                i -= 5;
            }
        }
        cout << s << endl;
    
}

4.反转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词

1)先对没用的空格进行去除 先使用双指针法去除

2)在进行全部反转的任务 然后再对每一个单词反转回来

class Solution {
public:
    string reverseWords(string s) {
        //1.去除多余的空格
        int slow_index=0;
        for(int fast_index=0;fast_index<s.size();fast_index++)
        {
            if(s[fast_index]!=' ')
            {
                //在每一个单词前面加一个空格
                if(slow_index!=0)
                {
                    s[slow_index]=' ';
                    slow_index++;
                }
                while(s[fast_index]!=' '&&fast_index<s.size())
                {
                    s[slow_index]=s[fast_index];
                    slow_index++;
                    fast_index++;
                }
            }
        }
        s.resize(slow_index);//删掉多余的空格
        //2.反转整个字符串
        reverse(s.begin(),s.end());
        //3.每个单词反转回来
        int start =0;
        for (int i = 0; i <= s.size(); i++)
        {
            if (i == s.size() || s[i] == ' ') 
            { //到达空格或者串尾,说明一个单词结束。进行翻转。
                reverse(s.begin()+start, s.begin()+i); //翻转,注意是左闭右闭 []的翻转。
                start = i + 1; //更新下一个单词的开始下标start
            }
        }
        return s;
    }
};

5.右旋字符串

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。

先将字符串整体旋转一下 使得整体颠倒后再对每一个部分进行颠倒

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    string s;
    cin>>n;
    cin>>s;
    reverse(s.begin(),s.end());
    reverse(s.begin(),s.begin()+n);
    reverse(s.begin()+n,s.end());
    std::cout << s << std::endl;
}

;