344.翻转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0, j = s.size() - 1;
while (i < j) {
swap(s[i], s[j]);
i++;
j--;
}
}
};
// 主函数
int main() {
Solution solution;
vector<char> s = { 'h','e','l','l','o'};
/*
string input;
cin >> input;
vector<char> s(input.begin(), input.end());
*/
solution.reverseString(s);
for (char c : s) {
cout << c;
}
return 0;
}
541.反转字符串ii
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
string reverseString(string s, int k) {
for (int i = 0; i < s.length(); i += (2 * k)) {
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= s.size()) {
reverse(s.begin() + i, s.begin() + i + k);
}
else {
// 3. 剩余字符少于 k 个,则将剩余字符全部反转。
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
// 主函数
int main() {
Solution solution;
string s = "abcdefg";
int k = 2;
string a = solution.reverseString(s, k);
for (char c : a) {
cout << c;
}
return 0;
}
54.替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 主函数
int main() {
string s;
while (cin >> s) {
int count = 0;
int sOldSize = s.length();
for (int i = 0; i < s.length(); i++) {
if (s[i] >= '0' && s[i] <= '9')count++;
}
s.resize(s.length() + count * 5);
int sNewSize = s.length();
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
if (s[j] > '9' || s[j] < '0') {
s[i] = s[j];
}
else {
s[i] = 'r';
s[i - 1] = 'e';
s[i - 2] = 'b';
s[i - 3] = 'm';
s[i - 4] = 'u';
s[i - 5] = 'n';
i -= 5;
}
}
cout << s << endl;
}
return 0;
}
151.翻转字符串里的单词(重点)
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
void reverse(string& s, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
void removeExtraSpace(string& s) {
int slow = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] != ' ') {
if (slow != 0) s[slow++] = ' ';
while (i < s.size() && s[i] != ' ') {
s[slow++] = s[i++];
}
}
}
s.resize(slow);
}
string reverseWorlds(string s) {
removeExtraSpace(s);
reverse(s, 0, s.size() - 1);
int start = 0;
for (int i = 0; i <= s.size(); ++i) {
if (i == s.size() || s[i] == ' ') {
reverse(s, start, i - 1);
start = i + 1;
}
}
return s;
}
};
// 主函数
int main() {
string s = " the sky is blue";
Solution solution;
cout << solution.reverseWorlds(s) << endl;
return 0;
}
右旋字符串
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 主函数
int main() {
int n;
string s;
cin >> n;
cin >> s;
int len = s.length();
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
cout << s << endl;
return 0;
}