代码随想录算法训练营第8天 | 344.反转字符串、541. 反转字符串 II、替换数字
- 344.反转字符串
- 题目描述
- 解题思路
- 解题过程
- 541. 反转字符串 II
- 题目描述
- 解题思路
- 解题过程
- 替换数字
- 题目描述
- 解题思路
- 解题过程
344.反转字符串
题目链接:344.反转字符串
题目描述
解题思路
双指针应用。一个指针指向第一个数,一个指针指向最后一个数,然后直接调换,swap,循环终止条件,left > right
暴力做法,直接reverse。
解题过程
classSolution{public:voidreverseString(vector<char>&s){intleft=0;intright=s.size()-1;while(left<right){swap(s[left++],s[right--]);}}};541. 反转字符串 II
题目链接:541. 反转字符串 II
题目描述
解题思路
与上一题类似,但是规则比较复杂,需要进一步模拟规则。
可以想到循环的时候直接跳2k个字符进行循环,因为他的规则是每2k个字符然后判断反转,若小于k个就将全反转。
只需要判断最后一个区间的右开端点要跟n取最小值,防止下标越界。
解题过程
classSolution{public:stringreverseStr(string s,intk){intn=s.size();for(inti=0;i<n;i+=k*2){reverse(s.begin()+i,s.begin()+min(i+k,n));}returns;}};替换数字
题目链接:
题目描述
解题思路
首先循环一遍判断有多少个数字,然后对数组进行扩充,最后从最后一个数向前替换。
解题过程
#include<iostream>usingnamespacestd;intmain(){string s;while(cin>>s){intoldIndex=s.size()-1;intcount=0;for(inti=0;i<s.size();i++){if(s[i]>='0'&&s[i]<='9')count++;}s.resize(s.size()+count*5);intnewIndex=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<<endl;return0;}