344.反转字符串
题目链接:https://leetcode.cn/problems/reverse-string/description/
文章讲解/视频讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html
这一题在循环条件的判断上我没搞清楚,我把i的停止条件设置为 i <= s.size()/2,但实际上应该是小于,不能等于。比如字符串长度为4,则i=0,1的时候就已经完成了反转,当i=4/2=2时,j=1,此时已经不满足i<j了,所以这里不能取等于。
那或许可以直接把条件设置为i<j,我试了一下这也是可以通过的,那这个条件简单一点。
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i = 0, j = s.size()-1; i < s.size()/2; i++, j--) {
swap(s[i],s[j]);
}
}
};
541. 反转字符串II
题目链接:https://leetcode.cn/problems/reverse-string-ii/description/
文章讲解/视频讲解:https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html
这一题有一个重要的技巧是直接让 i+=2*k。这样就不用一个一个遍历,效率高了很多。
遇到的几个问题:
1、因为对C++的reverse函数用法不熟悉,所以不知道原来reverse的第二个参数是不包含在反转的范围里的,边界条件写错了。
这里附上reverse的用法:
reverse 函数能够将给定范围内的元素反转。当使用 reverse 函数时,需要提供两个迭代器:一个指向范围开始的迭代器和一个指向范围结束的迭代器。这个函数会反转从第一个迭代器到第二个迭代器之间的元素,不包括第二个迭代器指向的元素。
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0; i < s.length(); i += 2 * k) {
if(i + k < s.length()) {
reverse(s.begin() + i, s.begin()+ i + k);
}
else {
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
2、这里用size和length都可以吗?
在C++中,std::string 类型提供了两个函数来获取字符串的长度:size() 和 length()。这两个函数在 std::string 类中是等价的,它们都返回字符串中字符的数量。
如果同时在处理 std::string 和其他容器(如 std::vector),则建议使用 size(),因为 size() 可以获取容器中元素的数量,而length不行。
卡码网:54.替换数字
题目链接:https://kamacoder.com/problempage.php?pid=1064
文章讲解:https://programmercarl.com/kama54.%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97.html
有个需要注意的地方:
扩充数组的时候为什么是count*5,“number”不是六个字母吗?
因为替换之后原来的数字就没有了,就会多出一个位置,因此是5不是6。
#include<iostream>
using namespace std;
int main(){
string s;
while(cin >> s) {
int count = 0;
int sOldSize = s.size();
for(int i = 0; i < sOldSize; i++) {
if(s[i] >= '0' && s[i] <= '9') {
count++;
}
}
s.resize(sOldSize + count * 5);
int sNewSize = s.size();
// i指向原数组,j指向新数组
for(int i = sOldSize - 1, j = sNewSize - 1; i >= 0; i--, j--) {
if(s[i] < '0' || s[i] > '9') { //遇到的不是数字
s[j] = s[i];
}
else {
s[j] = 'r';
s[j - 1] = 'e';
s[j - 2] = 'b';
s[j - 3] = 'm';
s[j - 4] = 'u';
s[j - 5] = 'n';
j -= 5;
}
}
cout << s << endl;
}
}
151.翻转字符串里的单词
题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/
文章讲解/视频讲解:https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html
对代码中&符号的用法还是不太理解
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 RemoveExtraSpaces(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 reverseWords(string s) {
RemoveExtraSpaces(s);
reverse(s, 0, s.size() - 1);
int start = 0;
for(int i = 0; i <= s.size(); i++) {
if(s[i] == ' ' || i == s.size()) {
reverse(s, start, i - 1);
start = i + 1;
}
}
return s;
}
};
卡码网:55.右旋转字符串
题目链接:https://kamacoder.com/problempage.php?pid=1065
文章讲解:
https://programmercarl.com/kama55.%E5%8F%B3%E6%97%8B%E5%AD%97%E7%AC%A6%E4%B8%B2.html
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
reverse(s.begin(),s.end());
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
cout << s << endl;
}