剑指offer 05. 替换空格 (easy)
#pragma once
#include<string>
using std::string;
/* 利用辅助字符串存储结果
class Solution {
public:
string replaceSpace(string s) {
string str;
for (auto ch : s) {
if (ch == ' ') {
str += "%20";
}
else {
str += ch;
}
}
return str;
}
};
*/
// 原地修改 (空间复杂度和时间复杂度都更好)
class Solution {
public:
string replaceSpace(string s) {
int counts = 0;
for (auto ch : s) { // 获取字符串s中的空格数
if (ch == ' ') {
++counts;
}
}
int n = s.size(); // 保存原s的size (因为扩容后会改变s的size)
s.resize(s.size() + 2 * counts); // 扩容 (使得s的空间正好容得下 替换后的字符串。之所以是2*counts而不是3*counts,是因为s中本来就有一个空格)
int i = n - 1, j = s.size() - 1; // i指向原s中最后一个元素,j指向扩容后s的最后一个位置
while (i != j) { // 从后完全复制内容,当所有空格都被替换后 i==j,即替换完成
if (s[i] != ' ') {
s[j--] = s[i--];
}
else {
s[j--] = '0';
s[j--] = '2';
s[j--] = '%';
--i;
}
}
return s;
}
};
官方题解:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/solution/mian-shi-ti-05-ti-huan-kong-ge-by-leetcode-solutio/ 剑指offer 58 - II. 左旋转字符串 (easy)
#pragma once
#include<string>
using std::string;
// 翻转
class Solution {
public:
void reverse(int left, int right, string& s);
string reverseLeftWords(string s, int n) {
int len = s.size();
reverse(0, len - 1, s); // 整体翻转
reverse(0, len - n - 1, s); // 局部翻转
reverse(len - n, len - 1, s); // 局部翻转
return s;
}
};
void Solution::reverse(int left, int right, string& s) {
while (left < right) {
std::swap(s[left++], s[right--]);
}
}