【代码随想录算法训练营——Day8】字符串——344.反转字符串、541.反转字符串II、卡码网:54.替换数字
LeetCode题目链接
https://leetcode.cn/problems/reverse-string/description/
https://leetcode.cn/problems/reverse-string-ii/description/
https://kamacoder.com/problempage.php?pid=1064
题解
344.反转字符串
受到了之前写的代码的启发(只因为意外的瞄了一眼),升华一下,用了双指针的方法写出来。之后再看看题解学一下有没有别的思路。
541.反转字符串II
本来觉得自己能写出来,但是突然不会了。想了一个繁琐的思路出来,还被AI提示了一句reverse库函数,其中的right的i - k - 1值,是debug调出来的。主要是判断结尾剩余字符串的大小赋值,以及要想到双指针确定边界的思路。
卡码网:54.替换数字
这题有两个思路,一是我第一次写的,调用插入库函数在原字符串进行插入“number”和删除数字,第二个是我本次写的,用字符串连接组成一个新字符串。
代码
//344.反转字符串
#include <iostream>
#include <vector>
using namespace std;class Solution {
public:void reverseString(vector<char>& s) {int left = 0, right = s.size() - 1;while (left <= right) {char tmp = s[left];s[left] = s[right];s[right] = tmp;left++;right--;}}
};int main() {vector<char> str = { 'h', 'e', 'l', 'l', 'o' };for (int i = 0;i < str.size();i++) {printf("%c", str[i]);}printf("\n");Solution s;s.reverseString(str);for (int i = 0;i < str.size();i++) {printf("%c", str[i]);}return 0;
}
//541.反转字符串II
#include <iostream>
#include <string>
using namespace std;class Solution {
public:string reverseStr(string s, int k) {int i = 0;while (1) {i += 2 * k;if (i <= s.size()) {int left = i - 2 * k, right = i - k - 1;reverse(s.begin() + left, s.begin() + right + 1);}else{int left = i - 2 * k;int right;if (s.size() - left < k) right = s.size() - 1;else right = i - k - 1;reverse(s.begin() + left, s.begin() + right + 1);break;}}return s;}
};int main() {string str = "abcd";int k = 2;Solution s;string result = s.reverseStr(str, k);cout << result << endl;return 0;
}
//卡码网:54.替换数字
#include <iostream>
#include <string>
using namespace std;string insertNumber(string s) {string result;for (int i = 0;i < s.size();i++) {if (s[i] >= 'a' && s[i] <= 'z') {result += s[i];}else {result += "number";}}return result;
}int main() {string str;cin >> str;string result = insertNumber(str);cout << result << endl;return 0;
}