1.反转字符串中的单词
1.1 题目
1.2 题解
首先将输入的字符串去除前面和后面的空格,注意单词之间的空格要保留,之后再对整个字符串翻转,之后再对每个单词进行翻转。
class Solution {
public:
string reverseWords(string s)
{
//首先删除多余空格
moveExtraSpace(s);
//反转整个字符串
reverseStr(0,s.size()-1,s);
int temp = 0;
//再将每个单词翻转过来
for (int i = 0; i <= s.size(); i++)
{
//到达字符串末尾或者单词末尾
if (i==s.size() || s[i] == ' ')
{
reverseStr(temp, i - 1, s);
temp = i+1;
}
}
return s;
}
/// <summary>
/// 反转没有空格的字符串
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
void reverseStr(int left,int right,string& s)
{
;
while (left < right)
{
swap(s[left++], s[right--]);
}
}
/// <summary>
/// 删除输入字符串中多余的空格
/// </summary>
/// <param name="s"></param>
void moveExtraSpace(string& s)
{
//定义快慢指针
int slow = 0, fast = 0;
for (; fast < s.size(); fast++)
{
if (s[fast] != ' ')
{
//slow!=0表示当前不是字符串开头
if (slow!=0)
{
//手动加一个空格
s[slow++] = ' ';
}
//补上单词
while (fast < s.size() && s[fast] != ' ')
{
s[slow++] = s[fast++];
}
}
}
s.resize(slow);
}
};
2.右旋转字符串
2.1 题目
2.2 题解
using namespace std;
#include<iostream>
#include<string>
#include<algorithm>
int main()
{
//输入的正整数
int k;
//输入的字符串
string s;
cin >> k >> s;
//先将字符串全部反转
reverse(s.begin(), s.end());
//再将前k个字母反转
reverse(s.begin(), s.begin() + k);
//再将后面的字符串反转
reverse(s.begin()+k, s.end());
cout<<s<<endl;
}
先将字符串全部反转,再分别反转前k个和后length-k个。