day8 字符串第一章
344 反转字符串
思路:使用两个指针一前一尾,逐个交换即可
class Solution {
public:
void reverseString(vector<char>& s) {
int l = 0, r = s.size() - 1;
while(l < r) {
swap(s[l++], s[r--]);
}
}
};
541. 反转字符串II
思路:我们要反转的字符数在2k的前k个,对于那段字符的起始下标,就是从0->2k->4k...,在翻转的过程中可能会遇到字符串个数不够的情况,判断一下够不够然后再进行翻转。
class Solution {
public:
string reverseStr(string s, int k) {
int len = s.size();
for(int i = 0; i < len; i += 2 * k) {
if(i + k < len) {
reverse(s.begin() + i, s.begin() + i + k);
}
else {
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
卡码网:54.替换数字
这题我直接偷懒了,遇到数字就输出"number"否则输出s[i]
#include <iostream>
#include <string>
using namespace std;
string nu = "number";
int main() {
string s;
cin >> s;
for(int i = 0; i < s.size();++i) {
if(s[i] >= '0' && s[i] <= '9') {
cout << nu;
}
else {
cout << s[i];
}
}
return 0;
}
151.翻转字符串里的单词
这种类型的题目都可以使用一个简单的处理方法,就是把参数string当作是你的输入流,然后直接让库函数去处理空格的关系,我们直接使用stringstream然后用这个作为输入流,需要根据空格转化成什么类型就用什么类型的参数接收。
class Solution {
public:
string reverseWords(string s) {
stringstream ss(s);
vector<string> t;
string tmp;
while(ss >> tmp) {
//cout << tmp << "\n";
t.push_back(tmp);
}
string ans = "";
int i;
for(i = t.size() - 1; i > 0; --i) {
ans+= t[i];
ans+= " ";
}
ans += t[i]; // 避免多一个空格
return ans;
}
};
对比卡哥的思路,这个思路有点偷鸡的感觉(
但是代码会简洁很多,思路上也简洁很多。
卡码网:55.右旋转字符串
这题直接模拟,但是应该会有更高效的思路,等有空再看看(
#include <iostream>
#include <string>
using namespace std;
string rev(string& s, int k) {
string ret = "";
for(int i = s.size() - k; i < s.size(); ++i) {
ret += s[i];
}
for(int i = 0; i < s.size() - k; i++) {
ret += s[i];
}
return ret;
}
int main() {
int k;
cin >> k;
string s;
cin >> s;
cout << rev(s, k);
return 0;
}

浙公网安备 33010602011771号