代码随想录算法训练营第七天 | LeetCode344.反转字符串、LeetCode541.反转字符串II、卡码网54.替换数字
01-1 LeetCode344.反转字符串
相关资源
题目:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
第一想法:申请一个新的字符数组就违反了题目的要求,然后突然想到反转字符串其实就是首尾两个字符进行交换,双指针法!
实现:代码如下:
#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
void reverseString(vector<char>& s) {
int i = 0;
int j = s.size() - 1;
while (i < j) {
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
return;
}
};
看完代码随想录之后的想法:
使用库函数与否的原则:如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数,如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数!
收获:c++可以直接使用库函数swap
ToDo:定时复习
01-2 LeetCode541.反转字符串II
相关资源
题目链接:反转字符串 II
文章讲解:反转字符串II
视频讲解:541. 反转字符串II
题目:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
第一想法:很复杂地先计算组数,然后计算剩余字符数,然后一组一组处理,剩余字符再处理,最后拼接在一起
实现:
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
class Solution {
public:
string reverseStr(string s, int k) {
int group_num = s.size() / (2 * k);
int remainder = s.size() % (2 * k);
string new_str = "";
for (int i = 0;i < group_num;i++) {
string str_to_be_reverse = s.substr(i*2*k,k);
string str_to_keep = s.substr(i * 2 * k + k, k);
reverse(str_to_be_reverse.begin(),str_to_be_reverse.end());
new_str.append(str_to_be_reverse);
new_str.append(str_to_keep);
}
if (remainder < k) {
string str_to_be_reverse = s.substr(group_num * 2 * k);
reverse(str_to_be_reverse.begin(), str_to_be_reverse.end());
new_str.append(str_to_be_reverse);
}
else {
string str_to_be_reverse = s.substr(group_num * 2 * k,k);
reverse(str_to_be_reverse.begin(), str_to_be_reverse.end());
string str_to_keep = s.substr(group_num * 2 * k+k);
new_str.append(str_to_be_reverse);
new_str.append(str_to_keep);
}
return new_str;
}
};
遇到的问题:逻辑太复杂
看完代码随想录之后的想法:通过i+=2k可以分段处理,不要思维定势!此外reverse函数可以自己写
收获:reverse(s.begin() + i, s.begin() + i + k )可以翻转字符串s的相应段
ToDo:通过i+=2k进行分段处理
01-3 卡码网54.替换数字
相关资源
- 题目链接:54. 替换数字(第八期模拟笔试) (kamacoder.com)
- 文章讲解:替换数字
题目:
题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number
输入示例
a1b2c3
输出示例
anumberbnumbercnumber
提示信息
数据范围:1 <= s.length < 10000。
第一想法:so easy!先创建一个空字符串,直接遍历一遍字符串,然后里面的字符如果是字母,直接push_back,如果是数字,则加上"number"这个字符串
实现:
#include<iostream>
#include <algorithm>
using namespace std;
int main() {
string str;
cin >> str;
string new_str = "";
for (int i = 0;i < str.size();i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
new_str.push_back(str[i]);
}
else {
new_str += "number";
}
}
cout << new_str << endl;
}
看完代码随想录之后的想法:数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作
ToDo:重做本题,不要新创建字符串
7169

被折叠的 条评论
为什么被折叠?



