1.力扣151.翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
思路:
1.将整个字符串中多余的空格去除
2.再将整个字符串进行反转
3.最后对各个单词进行反转
代码:
#include <bits/stdc++.h>
using namespace std;
/*
* 思路:
* 1.先去掉多余的空格
* 2.将整个字符串反转
* 3.再将单词反转
*/
//去除空格的函数
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);//最后字符串的长度就是slow
}
void Reverse(string &s,int left,int right){
while(left<=right){
swap(s[left],s[right]);
left++;
right--;
}
}
string reverseWords(string s){
//1.去除多余的空格
removeExtraSpaces(s);
//2.反转整个字符串
Reverse(s,0,s.size()-1);
//3.反转单词
int start=0;//单词起始位置
//i <= s.size()能等于的原因,因为需要字符串结束的地方有一个判断说明字符串已经结束并且要跟前面的单词结尾是空格的判断保持一致
for (int i = 0; i <= s.size(); ++i) {
if (s[i]==' '|| i==s.size()){
Reverse(s,start,i-1);
start=i+1;
}
}
return {s};
}
int main() {
string a=" hello world ";
cout<<'{'<<reverseWords(a)<<'}';
return 0;
}
2.右旋字符串:
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出:输出共一行,为进行了右旋转操作后的字符串。
思路:
1.首先整体反转
2.对前一段反转
3.对后一段反转
代码:
#include <bits/stdc++.h>
using namespace std;
string rightReserve(string s,int n){
//整体反转
reverse(s.begin(),s.end());
//第一段反转
reverse(s.begin(),s.begin()+n);
//反转第二段
reverse(s.begin()+n,s.end());
return s;
}
int main() {
string a="abcdefg";
int n=2;
cout<<rightReserve(a,n);
return 0;
}