344.反转字符串
反转字符串比较简单,除了用reverse,可以用for循环,两头向中间夹,进行swap
class Solution {
public:
void reverseString(vector<char>& s) {
int half=s.size()/2;
int length=s.size();
for(int i=0,j=length-1;i<half;i++,j--){
swap(s[i],s[j]);
}
}
};
541. 反转字符串II
文章链接:https://programmercarl.com/0541.反转字符串II.html#思路
题目链接:https://i.cnblogs.com/posts/edit
视频链接:https://www.bilibili.com/video/BV1dT411j7NN
思路:其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
总结:一开始这里我写的很麻烦,统计前2k的个数,还统计2nk之后的个数,然后每一种情况分别进行了代码逻辑的书写
class Solution {
public:
//子串翻转
void reverse(int start,int end,string &s){
for(int i=start,j=end;i<j;i++,j--){
swap(s[i],s[j]);
}
}
string reverseStr(string s, int k) {
int len=s.size();
int rem=len%(2*k);//若为0:恰好 0~k:翻转 k~2k:翻转前k个
int count=len/(2*k);
int start=0,curE=0;
if(count==0&&rem==0) return "";
if(count==0&&rem>0){
if(rem<=k) curE=rem-1;
else curE=k-1;
reverse(start,curE,s);
}
if(count>0){
curE=k-1;
for(int i=0;i<count;i++){
reverse(start,curE,s);
start+=2*k;
curE+=2*k;
}
if(rem>0){
if(rem<=k) curE=len-1;
reverse(start,curE,s);
}
}
return s;
}
};
改进后:
class Solution {
public:
string reverseStr(string s, int k) {
int n=s.size();
for(int i=0;i<n;i+=2*k){
int j=min(i+k,n);// 计算需要反转的区间结束位置
reverse(s.begin()+i,s.begin()+j);
}
return s;
}
};
卡码网:54.替换数字
文章链接:https://programmercarl.com/kama54.替换数字.html
题目链接:https://kamacoder.com/problempage.php?pid=1064
#include <iostream>
using namespace std;
int main(){
string s;
while(cin>>s){
int oldInd=s.size()-1;
int count=0;
int n=s.size();
for(int i=0;i<n;i++){
if(s[i]>='0'&&s[i]<='9'){ //字符可以这样比较大小,它们被分配了ASCII码
count++;
}
}
s.resize(s.size()+count*5);
int newInd=s.size()-1;
for(;oldInd>=0;oldInd--){
if(s[oldInd]>='0'&&s[oldInd]<='9'){
s[newInd--]='r';
s[newInd--]='e';
s[newInd--]='b';
s[newInd--]='m';
s[newInd--]='u';
s[newInd--]='n';
}
else{
s[newInd--]=s[oldInd];
}
}
cout << s << endl;
}
}
标签:int,反转,随想录,https,字符串,com,size
From: https://www.cnblogs.com/VickyWu/p/18453981