反转字符串 leetcode 344
class Solution {
public:
void reverseString(vector<char>& s) {
int index1=0,index2=s.size()-1;
char tmp;
while(index1<index2){
tmp=s[index1];
s[index1]=s[index2];
s[index2]=tmp;
index1++;
index2--;
}
}
};
操作字符串和数组原理一致,双指针思想。
总结
交换的时候可以使用swap(s[index1],s[index2]);
class Solution {
public:
void reverseString(vector<char>& s) {
int index1=0,index2=s.size()-1;
while(index1<index2){
swap(s[index1],s[index2]);
index1++;
index2--;
}
}
};
反转字符串Ⅱ 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);
continue;
}
reverse(s.begin()+i,s.end());
}
return s;
}
};
题目描述,每计数至2k个字符,就反转这2k字符中的前k个字符。所以我们for循环遍历时直接一次2k个遍历(i+=2*k),首先把每部分2k的前k个字符反转,然后直接continue进入下一次循环,使用if语句是为了把最后不足2k但大于k的情况合并进来,如果不满足if语句的条件就说明最后一段长度不足2k且小于k,最后一段直接全部反转。
总结
1.reverse(s.begin()+i,s.begin()+i+k);将字符串s从索引i到(i+k-1)的元素反转,C++库函数保持左开右闭原则。
替换数字 卡码网 54
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
while(cin>>s){
int count=0;
int oldSize=s.size()-1;
for(int i=0;i<s.size();i++){
if(s[i]<='9'&&s[i]>='0'){
count++;
}
}
s.resize(s.size()+count*5);
int newSize=s.size()-1;
while(oldSize>=0){
if(s[oldSize]<='9'&&s[oldSize]>='0'){
s[newSize--]='r';
s[newSize--]='e';
s[newSize--]='b';
s[newSize--]='m';
s[newSize--]='u';
s[newSize--]='n';
}else{
s[newSize--]=s[oldSize];
}
oldSize--;
}
}
cout<<s<<endl;
}
先计算输入字符串中数字个数,再对字符串大小进行扩容。然后新数组指针指向新数组末尾,旧数组指针指向旧数组末尾,如果旧数组指针指向的是数字就从后往前对新数组依次赋值“number”,如果旧数组指针指向的是字母就将这个字母添加到新数组中。
总结
1.新数组从后向前填充避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
2.while(cin>>s),当输入流cin成功读取一个字符串到s变量时,就执行循环体内的代码。这个循环会一直持续直到从cin读取字符串失败。
3.s.resize(newSize);改变字符串大小。
标签:卡码,newSize,int,54,随想录,--,数组,字符串,2k From: https://blog.csdn.net/hty123hty/article/details/140316314