LeetCode 344反转字符串
题目链接:344. 反转字符串 - 力扣(LeetCode)
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0, right = s.size() - 1;
while (left < right) {
swap(s[left], s[right]);
left++;
right--;
}
}
};
LeetCode 541反转字符串II
题目链接:541. 反转字符串 II - 力扣(LeetCode)
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += 2 * k) {
if (i + k - 1 < s.size()) {
reverse(s.begin() + i, s.begin() + i + k);//反转s[i]、s[i + k -1]之间的部分
}
else {
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
剑指Offer 05替换空格
题目链接:剑指 Offer 05. 替换空格 - 力扣(LeetCode)
自己写的,因为插入操作,效率低
class Solution {
public:
string replaceSpace(string s) {
int n = s.size();
int i = n - 1;
while (i >= 0) {
if (s[i] == ' ') {
s[i] = '0';
s.insert(s.begin() + i, '2');
s.insert(s.begin() + i, '%');
}
--i;
}
return s;
}
};
双指针法
class Solution {
public:
string replaceSpace(string s) {
int count = 0; //记录s中空格的个数
for (int i = 0; i < s.size(); ++i) {
if (s[i] == ' ') count++;
}
int i = s.size() - 1;
//扩展s的存储空间,没一个空格就要多出两个格子来存数据
s.resize(s.size() + 2 * count);
int j = s.size() - 1;
while (i >= 0 && i <= j) {
if (s[i] == ' ') {
s[j] = '0';
s[j - 1] = '2';
s[j - 2] = '%';
i--;
j -= 3;
}
else {
s[j] = s[i];
i--;
j--;
}
}
return s;
}
};
LeetCode 151反转字符串里的单词
题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)
思路就是:先去除多余空格、将字符串全部反转、再将字符串局部反转
//自己写的有点复杂,没有优化的代码
class Solution {
public:
string reverseWords(string s) {
//去除多余空格
int i = 0, j = 0;
while (i <= j && j < s.size()) {
if ((j == 0 && s[j] == ' ') || (j > 0 && s[j] == ' ' && s[j] == s[j - 1])) ++j;
else {
s[i] = s[j];
++i, ++j;
}
}
if (s[i - 1] == ' ') s.resize(i - 1);
else s.resize(i);
//整体反转
reverse(s.begin(), s.end());
//局部反转
int k = 0, l = 0;
while (k <= l && l < s.size()) {
while (l < s.size() && s[l] != ' ') ++l;
if (l < s.size()) {
reverse(s.begin() + k, s.begin() + l);
++l;
k = l;
}
else {
reverse(s.begin() + k, s.end());
}
}
return s;
}
};
//优化后的代码
class Solution {
private:
//去除多余空格
void removeExtraSpaces(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);
}
public:
string reverseWords(string s) {
//去除多余空格
removeExtraSpaces(s);
//整体反转
reverse(s.begin(), s.end());
//局部反转
int i = 0;
for (int j = 0; j <= s.size(); ++j) {
if (s[j] == ' ' || j == s.size()) {
reverse(s.begin() + i, s.begin() + j);
i = j + 1;
}
}
return s;
}
};
剑指Offer58-II左旋转字符串
题目链接:剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)
第一反应的傻瓜做法
class Solution {
public:
string reverseLeftWords(string s, int n) {
int len = s.size();
for (int i = 0; i < n; ++i) {
s.insert(s.end(), s[i]);
}
for (int i = 0, j = n; j < s.size(); ++i, ++j) {
s[i] = s[j];
}
s.resize(len);
return s;
}
};
大聪明做法:先局部再整体反转
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
reverse(s.begin(), s.end());
return s;
}
};