必须要开始继续刷算法啦!不然机试要烂啦!!!
344.反转字符串
题目链接:344. 反转字符串 - 力扣(LeetCode)
题目要求用o(1)的时间复杂度完成字符串反转,这个题感觉没什么难度,就是找到一个中间数,然后对称交换元素即可。不过字符串反转的模板后面的很多题目都要用上的。
class Solution {
public:
void reverseString(vector<char>& s) {
int len=s.size();
int mid=len/2-1;
for(int i=0;i<=mid;i++)
{
swap(s[i],s[len-i-1]);
}
}
};
541.反转字符串II
题目链接:541. 反转字符串 II - 力扣(LeetCode)
这个题目就比较复杂了,他有三种情况需要解决:
1.字符串剩余字符数量大于等于2k时,翻转前k个字符
2.字符串剩余字符数量大于等于k且小于2k,反转前k个字符串
3.字符串剩余字符数量小于k,全部进行翻转
其实分析一下就可以整合成两种情况:
1.字符串剩余字符数量大于等于k,反转前k个
2.字符串剩余字符数量小于k,全部翻转
按照这个思路去写就很好解决了。
class Solution {
public:
void reverse_string(string& s, int start, int end) {
int mid = (end - start + 1) / 2 - 1;
for (int i = 0; i <= mid; i++) {
swap(s[start + i], s[end - i]);
}
}
string reverseStr(string s, int k) {
int i = 0;
while (i < s.size()) {
if (s.size() - i >= k) {
int end = i + k;
int mid = (i + end + k) / 2 - 1;
reverse_string(s, i, i + k - 1);
i = i + 2 * k;
} else {
int end = s.size() - 1;
reverse_string(s, i, end);
i = i + 2 * k;
}
}
return s;
}
};
卡码网:54.替换数字
题目链接:54. 替换数字(第八期模拟笔试) (kamacoder.com)
输入一个字符串包含字母和数字,形式类似于"a1b2c3",需要把字符串里面的数字转换成字符串"number"
理论上最好的做法是原地做,我是开了一个新数组做的。可能不是最优的做法,但也AC了。
#include<iostream>
using namespace std;
int main()
{
string str;
string s="";
cin>>str;
for(int i=0;i<str.size();i++)
{
if(str[i]>='1'&&str[i]<='9') s+="number";
else s+=str[i];
}
cout<<s<<endl;
return 0;
}
从今天开始,算法训练一定要坚持每天做。加油加油加油!!!