代码随想录算法训练营Day8 字符串
字符串/字符数组
字符串的本质就是\(char\)类型的数组。关于字符串的处理,不同语言有一点点不一样。就我了解的,\(python\)的里面字符串是“不可变”的,所以他一般需要先转成列表,处理之后再回去;C++中的string本质是带终止符的字符数组。
所以我个人觉得,字符串的题目是另一类单独的专题,他跟普通的数组或者其他题目的思路不太一样,需要单独训练这个专题。
Leetcode 344. 反转字符串
题目链接:https://leetcode.cn/problems/reverse-string/description/
题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 \(s\) 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 \(O(1)\) 的额外空间解决这一问题。
题目解析:如果你对库函数比较熟,直接reverse就可以了。另一种写法是双向双指针,当然,因为双指针移动是对称的,直接使用单个指针也可以。
class Solution {
public:
void reverseString(vector<char>& s) {
// ranges::reverse(s);
for (int i = 0; i < s.size() / 2; i ++) {
std::swap(s[i], s[s.size() - 1 - i]);
}
}
};
Leetcode 541. 反转字符串 II
题目链接:https://leetcode.cn/problems/reverse-string-ii/submissions/657636073/
题目描述:给定一个字符串 \(s\) 和一个整数 \(k\),从字符串开头算起,每计数至 \(2k\) 个字符,就反转这 \(2k\) 字符中的前 \(k\) 个字符。
如果剩余字符少于 \(k\) 个,则将剩余字符全部反转。
如果剩余字符小于 \(2k\) 但大于或等于 \(k\) 个,则反转前 \(k\) 个字符,其余字符保持原样。
题目分析:考虑枚举。不难发现,需要反转的区间是$$[0, k),[k, k + k),[2k, 2k + k) ...[i, i + k)$$
所以我们考虑枚举所有区间的左边界。不难得到:
class Solution {
public:
string reverseStr(string s, int k) {
// 所有需要反转的区间:
// [0, k)
// [k, k + k)
// ......
// [i, i + k)
// 而std默认的reverse函数刚好是开区间的,这符合我们的心意
int n = s.size();
for (int i = 0; i < n; i += 2 * k) {
std::reverse(s.begin() + i, s.begin() + std::min(i + k, n));
}
return s;
}
};
卡码网 54. 替换数字
题目链接:https://kamacoder.com/problempage.php?pid=1064
题目描述:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
题目分析:考虑枚举。可以构造一个答案字符串。如果是数字,那么ans += "number";反之,ans += s[i]
#include <bits/stdc++.h>
using u32 = uint32_t;
using i64 = int64_t;
using u64 = uint64_t;
using i128 = __int128;
using u128 = unsigned __int128;
using namespace std;
#define F(i, a, b) for (int i = (a); i <= (b); i++)
#define Fd(i, a, b) for (int i = (a); i >= (b); i--)
#ifndef DEBUG
struct __X {
__X& operator<<(const auto& str) { return *this; }
void sp(const std::string& str = "") {}
} dout;
#define debug(x) ;
#endif
constexpr int mod = 998244353;
constexpr int MOD = 1E9 + 7;
constexpr int INF = 1E9;
constexpr int N = 2E5 + 10;
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
string s;
std::cin >> s;
for (auto& c : s) {
if (isdigit(c)) cout << "number";
else cout << c;
}
}
/* By Tangzy
⠄⠄⠄⠄⢠⣿⣿⣿⣿⣿⢻⣿⣿⣿⣿⣿⣿⣿⣿⣯⢻⣿⣿⣿⣿⣆⠄⠄⠄
⠄⠄⣼⢀⣿⣿⣿⣿⣏⡏⠄⠹⣿⣿⣿⣿⣿⣿⣿⣿⣧⢻⣿⣿⣿⣿⡆⠄⠄
⠄⠄⡟⣼⣿⣿⣿⣿⣿⠄⠄⠄⠈⠻⣿⣿⣿⣿⣿⣿⣿⣇⢻⣿⣿⣿⣿⠄⠄
⠄⢰⠃⣿⣿⠿⣿⣿⣿⠄⠄⠄⠄⠄⠄⠙⠿⣿⣿⣿⣿⣿⠄⢿⣿⣿⣿⡄⠄
⠄⢸⢠⣿⣿⣧⡙⣿⣿⡆⠄⠄⠄⠄⠄⠄⠄⠈⠛⢿⣿⣿⡇⠸⣿⡿⣸⡇⠄
⠄⠈⡆⣿⣿⣿⣿⣦⡙⠳⠄⠄⠄⠄⠄⠄⢀⣠⣤⣀⣈⠙⠃⠄⠿⢇⣿⡇⠄
⠄⠄⡇⢿⣿⣿⣿⣿⡇⠄⠄⠄⠄⠄⣠⣶⣿⣿⣿⣿⣿⣿⣷⣆⡀⣼⣿⡇⠄
⠄⠄⢹⡘⣿⣿⣿⢿⣷⡀⠄⢀⣴⣾⣟⠉⠉⠉⠉⣽⣿⣿⣿⣿⠇⢹⣿⠃⠄
⠄⠄⠄⢷⡘⢿⣿⣎⢻⣷⠰⣿⣿⣿⣿⣦⣀⣀⣴⣿⣿⣿⠟⢫⡾⢸⡟⠄.
⠄⠄⠄⠄⠻⣦⡙⠿⣧⠙⢷⠙⠻⠿⢿⡿⠿⠿⠛⠋⠉⠄⠂⠘⠁⠞⠄⠄⠄
⠄⠄⠄⠄⠄⠈⠙⠑⣠⣤⣴⡖⠄⠿⣋⣉⣉⡁⠄⢾⣦⠄⠄⠄⠄⠄⠄⠄⠄
*/

浙公网安备 33010602011771号