344. 反转字符串
题目链接
思路
这道题用的是双指针思路,但是即使是二刷,我还是没想起来!!
本人题解
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size();
for (int i = 0, j = n - 1; i < n / 2; i++, j-- ) {
swap(s[i], s[j]);
}
}
};
541. 反转字符串 II
题目链接
思路
知道是模拟,但是理不清思路!
本人题解
class Solution {
public:
void reverse(string& s, int i, int j) {
while (i < j){
swap(s[i], s[j]);
i++;
j--;
}
}
string reverseStr(string s, int k) {
//这道题应该是用的模拟的思路
for (int i = 0; i < s.size(); i += (2 * k)) {
if (i+k <= s.size()) {
reverse(s, i, i+k-1);
continue;
}
reverse(s, i, s.size()-1);
}
return s;
}
};
54. 替换数字
题目链接
思路
该题使用的是双指针思路,想到了,但是没有想的很明白。
本人题解
#include <iostream>
using namespace std;
int main () {
string s;
//这里为什么用一个while循环呢?
while (cin >> s) {//等待输入完成,按回车键
//统计输入的字符个数,统计输入的数字字数
int count = 0;
int oldSize = s.size();
for (int i = 0; i < oldSize; i++) {
if (s[i] > '0' && s[i] < '9') {
count++;
}
}
s.resize(oldSize + count * 5);
int newSize = s.size();
for (int i = newSize - 1, j = oldSize - 1; j < i; i--, j--) {
if (s[i] > '9' || s[i] < '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;
}
}
151. 反转字符串中的单词
题目链接
思路
双指针法移除多余的空格,但是相对于移除元素并不简单!翻转整个字符串再翻转字符串中的单词
本人题解
class Solution {
public:
void reverseStr(string &s, int i, int j) {
//定义的是左闭右闭区间
for (; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
void removeElement(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);
}
string reverseWords(string s) {
removeElement(s);
reverseStr(s, 0, s.size()-1);
int start = 0;
for (int i = 0; i <= s.size(); i++) {
if (i == s.size() || s[i] == ' ') {
reverseStr(s, start, i - 1);
start = i + 1;
}
}
return s;
}
};
右旋字符串
题目链接
思路
这道题的思路和翻转字符串中的单词相似,首先翻转整个字符串,再翻转前后两段!
本人题解
#include <iostream>
using namespace std;
#include <string>
void reverseStr(string& s, int i, int j) {
//作为一个左闭右闭区间
for (; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
int main () {
int num;
cin >> num;
string s;
while (cin >> s) {
int n = s.size();
reverseStr(s, 0, n - 1);
reverseStr(s, 0, num - 1);
reverseStr(s, num, n - 1);
}
cout << s <<endl;
}
15min做完这题!