● 344.反转字符
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i=0 , j=s.size()-1;i<s.size()/2;i++,j--){
swap(s[i],s[j]);
}
}
};
● 541. 反转字符串II
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=2*k){
//i+k-1<=s.size()-1
if(i+k<=s.size()){
//注意string中reverse函数用法
reverse(s.begin()+i,s.begin()+i+k);
}else{
reverse(s.begin()+i,s.end());
}
}
return s;
}
};
剑指Offer 05.替换空格
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
int temp = s.size();
for(int i=0;i<temp;i++){
if(s[i]==' '){
count++;
}
}
s.resize(temp+count*2);
for(int i = temp-1,j = s.size()-1;i>=0;i--){
if(s[i]==' '){
s[j] ='0';
s[j-1] = '2';
s[j-2] ='%';
j-=3;
}else{
s[j] = s[i];
j--;
}
}
return s;
}
};
151.翻转字符串里的单词(细节很多,第一次做踩坑很多)
class Solution {
public:
void removeExtraSpaces(string& s){
int slow=0;
for(int fast=0;fast<s.size();fast++){
//s[fast]一串非空格字符断了后,再初次遇到非空格,即开始一个新的单词
if(s[fast]!=' '){
if(slow!=0){
s[slow++]=' ';
}
//这里while是为了让fast一直连着下去,直到遇到一个空格退出循环,下次便可以再给s[slow]赋一个空格
while(fast<s.size()&&s[fast]!=' '){
s[slow++]=s[fast++];
}
}
}
s.resize(slow); //slow的大小即为去除多余空格后的大小。
}
void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 []
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(s, 0, s.size() - 1);
int start = 0; //removeExtraSpaces后保证第一个单词的开始下标一定是0。
for (int i = 0; i <= s.size(); i++) {
if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转。
reverse(s, start, i - 1); //翻转,注意是左闭右闭 []的翻转。
start = i + 1; //更新下一个单词的开始下标start
}
}
return s;
}
};
剑指Offer58-II.左旋(想不到,先局部翻转再整体翻转)
class Solution {
public:
void reverse(string& s,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
swap(s[i],s[j]);
}
}
string reverseLeftWords(string s, int n) {
reverse(s,0,n-1);
reverse(s,n,s.size()-1);
reverse(s,0,s.size()-1);
return s;
}
};