代码随想录算法训练营第八天|344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

题目:344.反转字符串

文章链接:代码随想录

视频链接:LeetCode:344.反转字符串

题目链接:力扣题目链接

图释:

// 反转字符串
void reverseString(vector<char>& s) {
	// 直接使用反转的库函数 reverse
	reverse(s.begin(), s.end());
	// 不使用
	for (int i = 0, j = s.size() - 1; i < s.size() / 2; i++, j--) {
		swap(s[i],s[j]);
	}
}

题目:541. 反转字符串II

文章链接:代码随想录

视频链接:LeetCode:541.反转字符串||

题目链接:力扣题目链接

图释:

// 反转字符串||
string reverseStr(string s, int k) {
	// 每计数2k进行一次反转
	for (int i = 0; i < s.size();i+=(2*k)) {
		// 不管是满足2k,还是满足大于k小于2k,只要+k不超过s的大小,都是反转前面的k个
		if ((i+k)<s.size()){
			reverse(s.begin() + i, s.begin() + i + k);
		}
		else {
			// 只有不满足k个,才把后面的都反转
			reverse(s.begin() + i, s.end());
		}
	}
	return s;
}

题目:卡码网:54.替换数字

文章链接:代码随想录

题目链接:卡码网题目链接

图释:

// 核心函数
// 替换数字
string  ReplaceNumbers(string s) {
	// 先遍历里面有多少个数组
	int NumbersNum = 0;
	for (int i = 0; i < s.size(); i++) {
		if ('0' <= s[i] && s[i] <= '9') {
			NumbersNum++;
		}
	}
	int originalSize = s.size();
	s.resize(s.size() + NumbersNum * 5);
	int right = s.size() - 1;
	for (int i = originalSize - 1; i >= 0; i--) {
		if ('0' <= s[i] && s[i] <= '9') {
			s[right--] = 'r';
			s[right--] = 'e';
			s[right--] = 'b';
			s[right--] = 'm';
			s[right--] = 'u';
			s[right--] = 'n';
		}
		else {
			s[right--] = s[i];
		}
	}
	return s;
}

题目:151.翻转字符串里的单词

文章链接:代码随想录

 视频链接:LeetCode:151.翻转字符串里的单词

题目链接:力扣题目链接

图释:

class Solution {
public:
    // 移除多余的空格
string  removeExtraSpaces(string s) {
	int slowIndex = 0, fastIndex = 0;
	// 移除头部空格
	while (s.size() > 0 && fastIndex<s.size() && s[fastIndex] == ' ') {
		fastIndex++;
	}
	// 移除中间的空格
	for (; fastIndex < s.size(); fastIndex++) {
		// 如果中间有连续空格,则fastIndex++
		if (fastIndex>0 && s[fastIndex - 1] == ' '&& s[fastIndex] == ' ') {
			continue;
		}
		else { // 如果不为连续空格才进行赋值
			s[slowIndex++] = s[fastIndex];
		}
	}
	// eg "_ _ 1 2 _ _"
	// 当"1 2 1(slow) 2 _(fast) _"时还执行一次s[slowIndex++] = s[fastIndex]; 复制完slowIndex++
	// 所以最后为->"1 2 _ 1(slow) 2 _(fast) _" fast超出界限
	// 移除尾端的空格
	if (slowIndex - 1 > 0 && s[slowIndex-1] == ' ') { //判断"1 2 _(slow-1) 1 2 _ _"
		s.resize(slowIndex-1);
	}
	else {
		s.resize(slowIndex); // 
	}
	return s;
}
// 反转字符串中的单词
string reverseWords(string s) {
	// 第一步  去除多余空格
	s = removeExtraSpaces(s);
	// 第二步  反转整个字符串
	reverse(s.begin(), s.end());
	// 第三步  反转单个单词
	int slowIndex = 0, fastIndex = 0;
	for (; fastIndex < s.size(); fastIndex++) {
		if (s[fastIndex] == ' ') {
			reverse(s.begin() + slowIndex, s.begin() + fastIndex);
			slowIndex = fastIndex + 1;
			fastIndex++;
		}
	}
	// 最后因为fastIndex==s.size()时,访问会出错,所以只能最后再反转
	reverse(s.begin() + slowIndex, s.end());
	return s;
}
};

题目:卡码网:55.右旋转字符串

文章链接:代码随想录

题目链接:卡码网题目链接

图释:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n;
	string s;
	cin >> n;
	cin >> s;
	int len = s.size();

	// 整体反转
	reverse(s.begin(), s.end());
	// 单独段进行反转
	reverse(s.begin(), s.begin()+n);
	reverse(s.begin() + n + 1, s.end());
	cout << s << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值