344. 反转字符串
思路:数组的翻转(基操)
void reverseString(vector<char>& s) {
for (int i = 0; i < s.size() / 2; i++) {
int temp = s[i];
s[i] = s[s.size() - i - 1];
s[s.size() - i - 1] = temp;
}
}
541. 反转字符串 II 学习
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
学习思路
这道题我的代码真的是一直再打补丁,补来补去,好不容易过了,因为我把题中三种情况都一一区分开来了, 就导致最后判断剩余字符串长度的代码写的很糟心,看了卡哥的思路才发觉 剩余字符串长度大于 k 但小于 2k 和 每 2k 长度就翻转前 k 个是可以合并的。然后只需要单独判断不满足 k 就行。每次写代码总是上来就写,有思路还好,没有思路就是发呆,然后不断打补丁,以后还是要先理清楚思路,再下手(下面是卡哥的代码)
void reverseString(string& s, int st, int l) {
while (st < l) {
int temp = s[st];
s[st] = s[l];
s[l] = temp;
st++;
l--;
}
}
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += (2 * k)) {
// 1. 每隔 2k 个字符的前 k 个字符进行反转
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
// 两个条件竟然能合并
if (i + k <= s.size()) {
reverseString(s, i, i + k - 1);
continue;
}
// 3. 剩余字符少于 k 个,则将剩余字符全部反转。
reverseString(s, i, s.size() - 1);
}
return s;
}
卡码网:54.替换数字
思路:基操
string exchangeStr(string s) {
string new_str;
int i = 0;
while (i < s.size()) {
char ch = s[i];
if (ch >= 'a' && ch <= 'z') {
new_str += ch;
}
else {
new_str.append("number"); // append 只能向字符串尾部添加字符串!
}
++i;
}
return new_str;
}
151. 反转字符串中的单词
思路:没啥技巧,就是考验代码功底(可惜了我是个补丁选手)
// 删除前导空格
void detelePreNull(string& s) {
if (s[0] != ' ') return; // 不存在前导空格
int count = 0;
while (count < s.size()) {
if (s[count] != ' ') break;
++count;
}
s = s.substr(count); // 从 count 开始截取字符串
}
// 删除后导空格
void deleteSufNUll(string& s) {
if (s[s.size() - 1] != ' ') return; // 不存在后导空格
int count = s.size() - 1;
while (count >= 0) {
if (count != ' ') break;
--count;
}
s = s.substr(0, count); // 截取 count 之前的字符串 包含 count
}
// 删除中间空格
void deleteMidNUll(string& s) {
string new_s;
int flag = 0; // 没有空格
for (int i = 0; i < s.size(); i++) {
if (s[i] != ' ') {
new_s += s[i];
flag = 0;
}
if (s[i] == ' ') {
if (flag) {
continue;
}
else {
new_s += s[i];
flag = 1;
}
}
}
s = new_s;
}
// 反转单词
void reverseString(string& s, int st, int l) {
while (st < l) {
int temp = s[st];
s[st] = s[l];
s[l] = temp;
st++;
l--;
}
}
string reverseWords(string s) {
// 去除多余的空格
detelePreNull(s);
deleteMidNUll(s);
deleteSufNUll(s);
// 整体翻转
reverseString(s, 0, s.size() - 1);
// 每个单词翻转
int i = 0, j = 0; // 记录每个单词起始位置
while (j < s.size()) {
if (j == s.size() - 1) reverseString(s, i, j); // 最后一个单词
if (s[j] != ' ' && s[j + 1] == ' ') { // 一个完整的单词
reverseString(s, i, j);
j = j + 2;
i = j;
}
else {
j++;
}
}
return s;
}
卡码网:55.右旋转字符串
思路:无脑使用内置函数
int main() {
int k;
cin >> k;
string s;
cin >> s;
string new_s = "";
new_s += s.substr(s.size() - k, k);
new_s += s.substr(0, s.size() - k);
cout << new_s;
return 0;
}