1.反转字符串
1.1 题目链接
1.2 题解
class Solution {
public:
void reverseString(vector<char>& s)
{
int left=0;
int right=s.size()-1;
while(left<(s.size()/2))
{
swapChar(s[left],s[right]);
left++;
right--;
}
}
private:
void swapChar(char& c1,char& c2)
{
char tmp=c1;
c1=c2;
c2=tmp;
}
};
利用双指针思想,一个最开始指向头,一个一开始指向尾,慢慢交换并向中间移动。
2.反转字符串2
2.1 题目链接
2.2 题解
class Solution {
public:
string reverseStr(string s, int k) {
for (int i = 0; i < s.size(); i += 2 * k) {
if (s.size() - (i + 1) < k) {
int left = i;
int right = s.size() - 1;
while (left < (i + s.size()) / 2) {
swap(s[left], s[right]);
left++;
right--;
}
}
else {
int left = i;
int right = i + k - 1;
while (left < (2 * i + k) / 2) {
swap(s[left], s[right]);
left++;
right--;
}
}
}
return s;
}
};
和反转字符串1思路差不多,但要考虑尾部不满足2k的情况
3.替换数字
3.1 题目链接
3.2 题解
using namespace std;
#include <iostream>
#include <string>
int main()
{
string s;
while (cin >> s)
{
//旧的末尾索引
int oldTailIndex = s.size() - 1;
//统计字符串中数字的个数
int count = 0;
for (auto i : s)
{
if (i >= '0' && i <= '9')
{
count++;
}
}
//给数组扩容
s.resize(s.size() + 5 * count);
//新的末尾索引
int newTailIndex = s.size() - 1;
//开始遍历
while (oldTailIndex >= 0)
{
//找到数字了
if (s[oldTailIndex] >= '0' && s[oldTailIndex] <= '9')
{
s[newTailIndex--] = 'r';
s[newTailIndex--] = 'e';
s[newTailIndex--] = 'b';
s[newTailIndex--] = 'm';
s[newTailIndex--] = 'u';
s[newTailIndex--] = 'n';
}
else
{
s[newTailIndex--]=s[oldTailIndex];
}
oldTailIndex--;
}
cout << s << endl;
}
}
思路就是先扩容再加入双指针的思想。