344. 反转字符串
https://leetcode.cn/problems/reverse-string/
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size();
for (int i = 0; i < n / 2; ++i) {
//交换元素
char temp = s[i];
s[i] = s[n-1-i];
s[n-1-i] = temp;
}
}
};
541. 反转字符串II
https://leetcode.cn/problems/reverse-string-ii/
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size();
// 记录闭区间 [left, left + 2 * k - 1] 这 2k 个字符
for (int right = -1; right < n; right += 2 * k) {
if(right > 0) {
// 反转 2k 字符中的前 k 个字符
int left = right - (2 * k - 1);
// [left, left + k - 1]
for (int i = left; i < (left + k / 2); ++i) {
swap(s[i], s[left + k - 1 - i + left]);
}
}
// 剩余字符
int diff = n - right - 1;
if (diff >= k && diff < 2 * k) { // 反转前 k 个字符 [right + 1, right + k]
for(int i = right + 1; i < (right + 1 + k / 2); ++i) {
swap(s[i], s[right + k - i + right + 1]);
}
break;
}
else if (diff < k) { // 反转剩余字符 [right + 1, n - 1]
for(int i = right + 1; i < (right + 1 + (n - right - 1) / 2); ++i) {
cout << i << " " << n - i + right << endl;
swap(s[i], s[n - i + right]); // n - 1 + right + 1 - i
}
break;
}
}
return s;
}
};
class Solution {
public:
void reverseString(int start, int end, string& s) {
for (int i = start, j = end; i < j; ++i, --j) {
swap(s[i], s[j]);
}
}
string reverseStr(string s, int k) {
int n = s.size();
// 记录闭区间 [left, left + 2 * k - 1] 这 2k 个字符
for (int left = 0; left < n; left += 2 * k) {
// 反转 2k 字符中的前 k 个字符 或 剩余字符小于 2k 但大于或等于 k 个的前 k 个字符
// [left, left + k - 1]
if (left + k <= n) {
reverseString(left, left + k - 1, s);
}
else { // 剩余字符少于 k 个,则将剩余字符全部反转 [left, n - 1]
reverseString(left, n - 1, s);
}
}
return s;
}
};
卡码网:54.替换数字
卡码网题目链接
题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number
#include <iostream>
#include <string>
using namespace std;
int main () {
string s;
while (cin >> s) {
int left = s.size() - 1;
int count = 0; // 统计数字的个数
for (char c : s) {
if( c >= '0' && c <= '9') {
count++;
}
}
// 扩容原数组为将数字替换为number之后的大小
s.resize(s.size() + count * 5);
int right = s.size() - 1;
while (left >= 0) {
if (!isdigit(s[left])) {
s[right--] = s[left];
}
else {
s[right--] = 'r';
s[right--] = 'e';
s[right--] = 'b';
s[right--] = 'm';
s[right--] = 'u';
s[right--] = 'n';
}
left--;
}
cout << s << endl;
}
}
#include <iostream>
#include <string>
using namespace std;
int main () {
string s;
while (cin >> s) {
string res;
for (char c : s) {
if (isdigit(c)) {
res += "number";
}
else {
res += c;
}
}
cout << res << endl;
}
}