字符串part01
1.反转字符串344
这道题可以直接用库函数中的reverse解决,但是由于主要目的是进行算法的练习,直接使用库函数不是本题的锻炼目的,所以还是需要自己构思怎么具体实现。
双指针法在这道题里同样好用,主要就是对称的两个位置进行交换,一个指针从前往后,一个指针从后往前。
我自己写的时候中间的交换部分就是老老实实三步走,但确实可以用swap函数来快速省略这些繁琐的步骤,逻辑上是相通的。
void reverseString(vector<char>& s) {
for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {
swap(s[i],s[j]);
}
}
2.反转字符串Ⅱ541
这道题在我一看到的时候,惯用思路就是多搞几个计数器,然后计算有没有到需要反转的位置或者剩下多少需不需要反转。但其实每次在遍历的时候直接移动2*k就行,因为要找的位置也是2*k区间的起点。这样能节省很多时间空间。
在这道题中就可以使用reverse来解决短区间的反转问题了。
class Solution {
public:
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=(2*k)){
if(i+k<=s.size()){
reverse(s.begin()+i, s.begin()+i+k);
}else{
reverse(s.begin()+i,s.end());
}
}
return s;
}
};
3.替换数字
可以直接将数组扩充成替换之后的长度,然后再从后往前将数字替换掉。
#include <iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
int sOldIndex = s.size() - 1;
int count = 0; // 统计数字的个数
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
// 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小
s.resize(s.size() + count * 5);
int sNewIndex = s.size() - 1;
// 从后往前将数字替换为"number"
while (sOldIndex >= 0) {
if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {
s[sNewIndex--] = 'r';
s[sNewIndex--] = 'e';
s[sNewIndex--] = 'b';
s[sNewIndex--] = 'm';
s[sNewIndex--] = 'u';
s[sNewIndex--] = 'n';
} else {
s[sNewIndex--] = s[sOldIndex];
}
sOldIndex--;
}
cout << s << endl;
}
}