今日问题:整体简单,有许多操作可以直接使用库函数来解决,但是在算法阶段,尽量学会其他的简便方法。
反转字符串
题目链接:LeetCode344、反转字符串
整体思路 :
思路一 :
反转一个字符串,直接使用reverse库函数就行,这个函数在库#include <algorithm>
class Solution {
public:
void reverseString(vector<char>& s) {
reverse(s.begin(),s.end());
}
};
思路二:
使用循环swap
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0,j = s.size()-1;
while(i<j)
{
swap(s[i],s[j]);
i++,j--;
}
}
};
反转字符串Ⅱ
题目链接:LeetCode541、反转字符串Ⅱ
整体思路:
使用一个for循环,遍历整个字符串,每次增加2k;
在循环中首先判断当前位置+k是不是超过了字符长度,超过了就反转到end,没超过就反转到i+k的位置
class Solution {
public:
string reverseStr(string s, int k) {
int i =0;
for(i;i<s.size();i=i+2*k)
{
if(i+k>s.size())
reverse(s.begin()+i,s.end());
else
{
reverse(s.begin()+i,s.begin()+i+k);
}
}
return s;
}
};
替换数字
题目链接:KamaCoder54、替换数字
整体思路:
思路一:
直接使用一个额外数组
#include <iostream>
// #include <bits/stdc++.h>
#include <cstdio>
using namespace std;
int main()
{
string s ,res;
cin >>s;
for(int i=0;i<s.size();i++)
{
if(s[i]>='a'&&s[i]<='z')//说明是字符
{
res +=s[i];
}
else
{
res +="number";
}
}
printf("%s",res.c_str());
// cout <<res<<endl;
return 0;
}
思路二:
不使用额外数组:
1、如果不使用额外的数组,首先确定的是要将字符串的尺寸resize为多大?
2、所以需要遍历字符串,查询有多少个数字,之后计算resize的尺寸
3、从后往前,将字符直接复制到后边,遇到数字从后往前替换成“number”
//不使用额外的空间
//需要在字符串后边添加空间:数字个数*(number-1)的空间
//通过将小写字母移动到最后,遇到数字就从后往前补number
#include <iostream>
using namespace std;
int main()
{
string s;
cin>>s;
//遍历字符串,统计数字的数量
int nums=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9') nums++;
}
//记录旧空间的尺寸,作为一个指针的起始位置
int i = s.size()-1;
//对字符串开辟新空间
s.resize(s.size()+(6-1)*nums);
//从后往前遍历整个新的字符串
for(int j = s.size()-1;j>=0&&i>=0;j--)
{
if(s[i]>='a'&&s[i]<='z')//是字符
{
s[j]=s[i];
i--;
}
else
{
i--;
s[j--]='r';
s[j--]='e';
s[j--]='b';
s[j--]='m';
s[j--]='u';
s[j]='n';
}
}
cout <<s<<endl;
//
return 0;
}