代码随想录算法训练营第八天 | Leetcode344.反转字符串、Leetcode541. 反转字符串II 、剑指Offer05.替换空格、Leetcode151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
Leetcode344.反转字符串
这题太简单了直接手写一个swap就得了
class Solution {
public:
void reverseString(vector<char>& s) {
int size=s.size();
for(int i=0;i<size/2;i++){
char temp=s[i];
s[i]=s[size-1-i];
s[size-1-i]=temp;
}
}
};
Leetcode541. 反转字符串II
注意
reverse(str.begin(),str.end())
实现的是[begin,end)的反转。- 表示2k的时候不能直接写2k要写2*k
比较简单不多赘述
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;
}
};
剑指Offer05.替换空格
最简单的方法,直接再开个字符串就行
class Solution {
public:
string replaceSpace(string s) {
string result;
for(int i=0;i<s.size();i++){
if(s[i]==' ') result+="%20";
else result+=s[i];
}
return result;
}
};
试试不申请新内存,用双指针写了一个。
class Solution {
public:
string replaceSpace(string s) {
int count=0;
for(int i=0;i<s.size();i++){
if(s[i]==' ') count++;
}
int OldSize=s.size();
s.resize(s.size()+count*2);
int NewSize=s.size();
for(int j=NewSize,i=OldSize;i<j;j--,i--){
if(s[i]!=' ') s[j]=s[i];
else{
s[j]='0';
s[j-1]='2';
s[j-2]='%';
j-=2;
}
}
return s;
}
};
Leetcode151.翻转字符串里的单词
这道题挺复杂的,非常考察对双指针的运用,主要是没有想到先翻转整体,再翻转单词的方法。
注意
- 分块实现的思想,将整体操作分为Remove函数、reverse函数和main来分别实现各个功能
- 先翻转整体,再翻转单词。
- 双指针法时刻牢记。
class Solution {
public:
//去除多余空格
void RemoveExtraSpaces(string& s){
int slow=0;
for(int fast=0;fast<s.size();fast++){
if(s[fast]!=' '){
if(slow!=0) s[slow++]=' ';
while(fast<s.size()&&s[fast]!=' '){
s[slow++]=s[fast++];
}
}
}
s.resize(slow);
}
//反转字符串
void Reversestr(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);
Reversestr(s,0,s.size()-1);
for(int slow=0,fast=0;fast<=s.size();fast++){
if(s[fast]==' '||fast==s.size()){
Reversestr(s,slow,fast-1);
slow=fast+1;
fast++;
}
}
return s;
}
};
剑指Offer58-II.左旋转字符串
首先还是最无脑的开一块新内存方法,没啥可说的
class Solution {
public:
string reverseLeftWords(string s, int n) {
string result;
for(int i=n;i<s.size();i++){
result+=s[i];
}
for(int i=0;i<n;i++){
result+=s[i];
}
return result;
}
};
想了个巧妙的方法来整活:直接s后面拼个s,然后从n截开
class Solution {
public:
string reverseLeftWords(string s, int n) {
s+=s;
for(int i=n;i<n+s.size()/2;i++){
s[i-n]=s[i];
}
s.resize(s.size()/2);
return s;
}
};