今日任务
344. 反转字符串
- 题目链接: https://leetcode.cn/problems/reverse-string/description/
- 题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1: 输入:[“h”,“e”,“l”,“l”,“o”] 输出:[“o”,“l”,“l”,“e”,“h”]
示例 2: 输入:[“H”,“a”,“n”,“n”,“a”,“h”] 输出:[“h”,“a”,“n”,“n”,“a”,“H”]
Solution
class Solution {
public:
void reverseString(vector<char>& s) {
// int len = s.size();
// for(int i = 0; i < len / 2; i++){
// char c = s[i];
// s[i] = s[len - i - 1];
// s[len - i - 1] = c;
// }
int left = 0, right = s.size() - 1;
while(left < right){
swap(s[left], s[right]);
left++;
right--;
}
}
};
541. 反转字符串 II
- 题目链接: https://leetcode.cn/problems/reverse-string-ii/description/
- 题目描述:
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = “abcdefg”, k = 2 输出: “bacdfeg”
Solution 尝试了许多方法
class Solution {
public:
string reverseStr(string s, int k) {
// string ans = "";
// int pos = 0;
// pos += k;
// int t = 2 * k;
// while(pos <= s.size()){
// if(pos % t == 0){
// string tmp = s.substr(pos - t, k);
// reverse(tmp.begin(), tmp.end());
// ans += tmp;
// ans += s.substr(pos - k, k);
// }
// pos += k;
// }
// pos = s.size();
// int remain = pos % t;
// if(remain == 0){
// return ans;
// }
// if(remain < k){
// string tmp = s.substr(pos - remain);
// reverse(tmp.begin(), tmp.end());
// ans += tmp;
// }else{
// string tmp = s.substr(pos - remain, k);
// reverse(tmp.begin(), tmp.end());
// ans += tmp;
// ans += s.substr(pos - remain + k);
// }
// return ans;
// for(int i = 0; i < s.size(); i += (2 * k)){
// if(i + k <= s.size()){
// reverse(s.begin() + i, s.begin() + i + k);
// continue;
// }
// reverse(s.begin() + i, s.end());
// }
// return s;
// int n = s.size();
// for(int i = 0; i < n; i += 2 * k){
// reverse(s.begin() + i, s.begin() + min(n, i + k));
// }
// return s;
int n = s.size();
for(int i = 0; i < n; i += 2 * k){
int left = i, right = i + k <= n ? i + k - 1 : n - 1;
while(left < right){
swap(s[left++], s[right--]);
}
}
return s;
}
};
54. 替换数字(第八期模拟笔试)
- 题目链接: https://kamacoder.com/problempage.php?pid=1064
- 题目描述:
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
对于输入字符串 “a5b”,函数应该将其转换为 “anumberb”
输入:一个字符串 s,s 仅包含小写字母和数字字符。
输出:打印一个新的字符串,其中每个数字字符都被替换为了number
样例输入:a1b2c3
样例输出:anumberbnumbercnumber
数据范围:1 <= s.length < 10000
Solution 暴力 + 从后遍历 + ostringstream
#include <iostream>
#include <string>
#include <sstream>
using std::cin, std::cout, std::endl;
using std::string, std::ostringstream;
int main(void){
string str;
cin >> str;
// for(char c : str){
// if(isdigit(c)){
// cout << "number";
// }else{
// cout << c;
// }
// }
// 法2
// int n = str.size();
// int count = 0;
// for(char c : str){
// if(isdigit(c)){
// count++;
// }
// }
// str.resize(n + count * 5);
// int right = str.size() - 1;
// for(int i = n - 1; i >= 0; i--){
// if(isdigit(str[i])){
// str[right--] = 'r';
// str[right--] = 'e';
// str[right--] = 'b';
// str[right--] = 'm';
// str[right--] = 'u';
// str[right--] = 'n';
// }else{
// str[right--] = str[i];
// }
// }
// cout << str << endl;
// 法3
ostringstream oss;
for(char c : str){
if(isdigit(c)){
oss << "number";
}else{
oss << c;
}
}
cout << oss.str() << endl;
return 0;
}