文章目录
LeetCode 344.反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
int left=0,right=s.size()-1;
while(left<right){
char tmp=s[left];
s[left]=s[right];
s[right]=tmp;
left++;
right--;
}
}
};
这个题目说明了在刷题目时什么情况下可以用库函数而什么情况下尽量不要使用库函数。
- 如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。
- 如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。
LeetCode 541.反转字符串||
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;
}
};
较简单
KamaCoder 54.替换数字
my opnion
#include<iostream>
#include<cstring>
using namespace std;
string replace(string s,int k){
string res;
string s1,s2;
for(int i=0;i<k;i++){
s1+=s[i];
}
for(int i=k+1;i<s.size();i++){
s2+=s[i];
}
res=s1+"number"+s2;
return res;
}
int main(){
string s;
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]<='9' && s[i]>='0'){
s=replace(s,i);
}
}
cout<<s;
}
这里我没有用到卡哥的双指针思想,自己写的也可以。
注意:
- 在replace函数中,对新创建的字符串添加值用+
- 在main函数的判定条件中,0和9都是字符
双指针法
#include<iostream>
#include<cstring>
using namespace std;
int main(){
string s;
while(cin>>s){
int slow,fast;
int count=0;
for(int i=0;i<s.size();i++){
if(s[i]<='9' && s[i]>='0'){
count++;
}
}
slow=s.size()-1;
s.resize(s.size()+5*count);//对指针扩容要熟悉
fast=s.size()-1;
while(slow>=0){//这里条件是slow>=0
if(s[slow]<='9' && s[slow]>='0'){
s[fast--]='r';
s[fast--]='e';
s[fast--]='b';
s[fast--]='m';
s[fast--]='u';
s[fast--]='n';
}
else{
s[fast--]=s[slow];
}
slow--;
}
cout<<s<<endl;
}
}
双指针法的优点是没有使用额外的内存空间就完成了替换。
这点卡哥的博客写的很清楚,不需要额外补充。
LeetCode 151.翻转字符串里的单词
class Solution {
public:
void reversespace(string &s){
int slow=0;
for(int i=0;i<s.size();i++){
if(s[i]!=' '){
if(slow!=0)s[slow++]=' ';
while(i<s.size()&&s[i]!=' '){
s[slow++]=s[i++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
reversespace(s);
reverse(s.begin(),s.end());
int k=0;
for(int i=0;i<=s.size();i++){//这里注意条件是<=,最后要用到i=s.size()的情况。
if(s[i]==' ' || i==s.size()){
reverse(s.begin()+k,s.begin()+i);
k=i+1;
}
}
return s;
}
};
- 整体思路比较奇特,对于,先清楚字符串中多余的空格,翻译过来就是将首尾的空格删去,然后在中间每个单词间的空格删除为1。
- 然后先翻转整体字符串,然后根据空格为依据分别翻转每一个单词。
KamaCoder 55.右旋字符串
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int n;
string s;
while(cin>>n>>s){
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
cout<<s;
}
}
这个思路很巧妙,先整体翻转,再局部翻转,也可以先局部再整体,卡哥博客写的很清晰。
总结
对于字符串的处理,常常会用整体翻转和部分翻转的思路,比较奇特。