反转字符串
题目解答
class Solution {
public:
string reverseStr(string s, int k) {
int len = s.length();
bool flag = true;
int count = 0;
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;
}
};
解题心得
1、卡哥的解法很有牛,让我长知识了。
2、在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
替换数字
题目解答
-
#include<iostream> #include<string> using namespace std; int main() { string str; cin >> str; int count = 0; int len1 = str.length(); for (int i = 0; i < str.length(); i++) if (str[i] >= '0' && str[i] <= '9') count++; str.resize(str.length() + count * 5); int len2 = str.length(); int i = len1 - 1, j = len2 - 1; while (i >= 0) { if (str[i] >= '0' && str[i] <= '9') { //替换为number str[j] = 'r'; str[j - 1] = 'e'; str[j - 2] = 'b'; str[j - 3] = 'm'; str[j - 4] = 'u'; str[j - 5] = 'n'; j -= 6; i--; } else { str[j--] = str[i--]; } } cout << str << endl; return 0; }
附:该题目先使用resize扩容,再使用双指针从后往前进行对字符串数组的填充。(看的卡哥的解答)
-
#include<iostream> #include<string> using namespace std; int main(){ int i=0; string s; cin>>s; while(i<s.length()){ if((int) s[i]-'1'>=0 && (int) s[i]-'1'<=9){ s.replace(i,1,"number"); i+=5; } i++; } cout<<s<<endl; return 0; }
附:这是自己写的(调用库函数),还是没啥意思。
翻转字符串里的单词
题目解答(添加了一些代码,以便能够在编译器上运行)
#include<iostream>
#include<string>
using namespace std;
class Solution {
public:
string reverseWords(string s) {
int slow = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] != ' ') {
if (slow != 0) s[slow++] = ' ';
while (i < s.length() && s[i] != ' ') s[slow++] = s[i++];
}
}
s.resize(slow);
reverse(s.begin(), s.end());
int i = 0;
while (i < slow) {
int temp = i;
while (i < slow && s[i] != ' ') i++;
reverse(s.begin() + temp, s.begin() + i );
i++;
}
return s;
}
};
int main() {
string s;
getline(cin, s);
Solution s1;
s = s1.reverseWords(s);
cout << s << endl;
return 0;
}
解题心得
1、解答该题目要消除空格和翻转字符串。
2、消除空格,就像当时的消除数组中的元组一样,定义两个指针进行操作,对于该题一定要记住一点,我们只对非空格操作,对于每一个单词都要在前面加一个空格(第一个单词除外)。那么如何对第一个单词进行操作,那么就是当 slow 为 0 时也就是第一个单词的时候。
3、翻转字符串,先翻转整体的字符串,然后在逐个翻转单个单词。