代码随想录第八天

344. 反转字符串

添加链接描述
在这里插入图片描述
这道题主要就是reverse,可以直接用,也可以手写一个
代码:

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

541. 反转字符串 II

添加链接描述
在这里插入图片描述
做题时不太理解reverse函数的用法,它的第二个迭代器指的是元素最后一个的下一个位置

class Solution {
public:
    string reverseStr(string s, int k) {
        //s.end()指向的是最后一个元素的写一个的位置,在 reverse 算法中,它不会改变 a.end() 的位置
        for(int left=0;left<s.size();left+=2*k)
        {
            if(left+k<s.size()) reverse(s.begin()+left,s.begin()+left+k);
            else reverse(s.begin()+left,s.end());
        }
        return s;
    }
};

替换数字

添加链接描述
在这里插入图片描述

# include<iostream>
# include <string>

using namespace std;

int main()
{
	string s;
	int count = 0;
	cin >> s;
	int oldindex = s.size() - 1;
	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] >= '0' && s[i] <= '9')count++;
	}
	s.resize(s.size() + count * 5);
	int newindex = s.size() - 1;
	while (oldindex >= 0)
	{
		if (s[oldindex] >= '0' && s[oldindex] <= '9')
		{
			s[newindex--] = 'r';
			s[newindex--] = 'e';
			s[newindex--] = 'b';
			s[newindex--] = 'm';
			s[newindex--] = 'u';
			s[newindex--] = 'n';
		}
		else s[newindex--] = s[oldindex];
		oldindex--;
	}
	cout << s;
	return 0;
}
# include<iostream>
# include <string>
 
using namespace std;
 
int main()
{
    string s;
    cin >> s;
    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            cout << "number";
        }
        else cout << s[i];
    }
    return 0;
}

在这里插入图片描述
这里是KIMI给的

翻转字符串里的单词

添加链接描述
在这里插入图片描述
我写的时候处理不好多个空格的问题,没写出来,这里是快慢指针去空格加上全部反转与局部反转,需要好好消化一下

class Solution {
public: 
        void reverse(string &s,int start,int end)
        {
            for(int i=start,j=end;i<j;i++,j--)
            swap(s[i],s[j]);
        }

        void removeEnterSpace(string & s)
        {
            int slow=0;
            for(int fast=0;fast<s.size();fast++)
            {
                if(s[fast]!=' ')
                {
                    if(slow!=0)s[slow++]=' ';
                    while(fast<s.size()&&s[fast]!=' ')
                    {
                        s[slow++]=s[fast++];
                    }
                }
            }
            s.resize(slow);
        }
    string reverseWords(string s) {
        removeEnterSpace(s);
        reverse(s,0,s.size()-1);
        int start=0;
        for(int i=0;i<=s.size();i++)
        {
            if(s[i]==' '||i==s.size())
            {
                reverse(s,start,i-1);
                start=i+1;
            }
        }
        return s;
    }
};

右旋字符串

添加链接描述
在这里插入图片描述
思路与上一代道题相似,全部反转加上局部反转,当然还有花费更多的空间的解法,这个是在原数组操作,没有多余的空间开销
代码:

# include <iostream>
# include <string>
# include <algorithm>

using namespace std;

int main()
{
	int k;
	string str;
	cin >> k >> str;
	reverse(str.begin(), str.end());
	reverse(str.begin(), str.begin() + k);
	reverse(str.begin() + k, str.end());

	cout << str;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值