学习文章链接:代码随想录
一、151.翻转字符串里的单词
题目链接:151.翻转字符串里的单词
思路:将整个字符串翻转,删除多余空格,将每个单词再反转一遍。使用快慢指针来判断是否有多余空格。
class Solution {
public:
void reverseall(string& s){
for(int i=0,j=s.size()-1;i<s.size()/2;i++,j--){
swap(s[i],s[j]);
}
}
void deletespace(string& s){
int slow=0,fast=0;
while(fast<s.size() && s[fast]==' '){
fast++;
}
for(fast;fast<s.size();fast++){
if(fast>1&&s[fast-1]==s[fast]&&s[fast]==' '){
continue;
}
else{
s[slow++]=s[fast];
}
}
if(slow- 1 > 0 && s[slow - 1] == ' '){
s.resize(slow- 1);
}
else{
s.resize(slow);
}
}
string reverseWords(string s) {
reverseall(s);
deletespace(s);
int start=0;
for(int i=0;i<s.size();i++){
if(s[i]==' '||i==s.size()-1){
int end = (i!=s.size()-1)?i - 1:i;
while (start < end) {
swap(s[start++], s[end--]);
}
start=i+1;
}
}
return s;
}
};
二、卡码网:55.右旋转字符串
题目链接:卡码网:55.右旋转字符串
思路:现将所有字符都翻转,然后翻转前n个数,再翻转后面所有字符。
#include<iostream>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
for(int i=0,j=s.size()-1;i<s.size()/2;i++,j--){
swap(s[i],s[j]);
}
for(int i=0,j=n-1;i<n/2;i++,j--){
swap(s[i],s[j]);
}
for(int i=n,j=s.size()-1;i<(s.size()+n)/2;i++,j--){
swap(s[i],s[j]);
}
cout << s << endl;
}