本文最后更新于 186 天前,其中的信息可能已经有所发展或是发生改变。
151.翻转字符串里的单词
这一题主要的难点其实在于移除多余的空格.
如果想要让空间复杂度位O(1),也就是不采用辅助空间的话,我们应该想到双指针法.
整体思路大概是,快指针定位到单词的位置,再将单词插入慢指针所指向的位置,除了慢指针指向开头时,每次将快指针的值(也就是单词)赋给慢指针时,要先加一个空格,以此来划分单词.
class Solution {
public:
void removeExSpaces(string &s) {
int slow = 0;
int fast = 0;
for (; 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);
}
string reverseWords(string s) {
removeExSpaces(s);
reverse(s.begin(), s.end());
for (int i = 0; i < s.size();i++) {
if (s[i] != ' ') {
int j = i;
while (j < s.size() && s[j] != ' ') {
j++;
}
reverse(s.begin() + i, s.begin() + j);
i = j;
}
}
return s;
}
};
右旋字符串
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出:输出共一行,为进行了右旋转操作后的字符串。
样例输入:
2
abcdefg
样例输出:
fgabcde
数据范围:1 <= k < 10000, 1 <= s.length < 10000;
根据思路,我第一时间的想法是,先将整个字符串反转,再将两部分部分反转回来
运用库函数还是挺简单的
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int k;
string s;
cin >> k;
cin >> s;
reverse(s.begin(), s.end());
reverse(s.begin(),s.begin()+k);
reverse(s.begin()+k,s.end());
cout << s << endl;
}