344.反转字符串
思考:
不额外申请空间,用双指针交换,双指针就是记录数组下标。交换元素可以直接用swap(s[st],s[ed])
代码:
void reverseString(vector<char>& s) {
if(s.empty()) return;
int st = 0;
int ed = s.size() -1;
while(st < ed)
{
swap(s[st],s[ed]);
st++;
ed--;
}
}
541. 反转字符串II
代码:
class Solution {
public:
void MySwap(string& s, int left, int right)
{
if(s.empty()) return;
if(left < 0 || right + 1 > s.size()) return;
int i = left;
int j = right;
while(i<j)
{
swap(s[i],s[j]);
i++;
j--;
}
}
string reverseStr(string s, int k) {
if(s.size() < 2) return s;
int left = 0;
int right = 2*k - 1;
while(right < s.size())
{
MySwap(s,left,left + k - 1);
left = right + 1;
right += 2*k;
}
if(left < s.size())
{
int leave_length = s.size() - left;
if(leave_length < k) MySwap(s,left,s.size() - 1);
else if(leave_length < 2 * k) MySwap(s,left,left + k - 1);
else;
}
return s;
}
};
替换数字
例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。
#include <iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
int sOldIndex = s.size() - 1;
int count = 0; // 统计数字的个数
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
// 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小
s.resize(s.size() + count * 5);
int sNewIndex = s.size() - 1;
// 从后往前将数字替换为"number"
while (sOldIndex >= 0) {
if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
s[sNewIndex--] = 'r';
s[sNewIndex--] = 'e';
s[sNewIndex--] = 'b';
s[sNewIndex--] = 'm';
s[sNewIndex--] = 'u';
s[sNewIndex--] = 'n';
} else {
s[sNewIndex--] = s[sOldIndex];
}
sOldIndex--;
}
cout << s << endl;
}
}
151.翻转字符串里的单词
class Solution {
public:
// 翻转字符串下标left到right子串
void MyReverse(string& s, int left, int right)
{
if(s.empty() || left <0; right > s.size() - 1) return;
for(int i = left, j = right; i < j; i++, j--)
{
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
void DeleteEmpty(string& s)
{
if(s.empty()) return;
int fast = 0, slow = 0;
while(fast < s.size() &&s[fast] == ' ') fast++; // 去掉开头的空格
// 去除中间的空格
for(;fast < s.size();fast++)
{
if (fast - 1 >=0 && s[fast - 1] == s[fast]&&s[fast] == ' ') continue;
s[slow] = s[fast];
slow++;
}
// 去除末尾空格加上重置s的大小
// 注意退出循环时slow++
if(slow - 1 >= 0 && s[slow - 1] == ' ') s.resize(slow - 1);
else s.resize(slow);
}
// 思路:
// 1. 去除多余的空格,包括头尾和中间
// 2. 翻转整个字符串
// 3. 翻转单个单词
string reverseWords(string s) {
MyReverse(s, 0, s.size() - 1); // 翻转全部字符串
DeleteEmpty(s); // 去空格
int left = 0;
// i可以取到s.size,交换的是left 和 i - 1
for(int i = 0; i <= s.size(); ++i)
{
// 遇到空格或者队尾
if(i == s.size() || s[i] == ' ')
{
MyReverse(s, left, i - 1); // 翻转空格隔开的字符串
left = i + 1;
}
}
return s;
}
};