目录
- 344、反转字符串
- 题目描述
- 思路
- 代码
- 反转字符串II
- 题目描述
- 思路
- 代码
- 替换数字
- 题目描述
- 思路
- 代码
344、反转字符串
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路
双指针法:使用两个指针分别指向要交换的元素,进行交换操作。然后不断迭代指针指向,两个指针分别在前半部分从前往后移动、在后半部分从后往前移动。
代码
class Solution {
public:void reverseString(vector<char>& s) {for (int i = 0, j = s.size() - 1; i < s.size()/2;i++, j--) {int tmp = s[i];s[i] = s[j];s[j] = tmp;}}
};
时间复杂度:O(n);使用指针遍历整个字符串。
空间复杂度:O(1);原地反转。
反转字符串II
题目描述
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
思路
本题为模拟,实现题目中的反转规则即可。
- 设置一个指针从字符串的开头开始
- 每次移动2k
- 然后根据题目进行条件判断
- 找到对应的情况进行翻转
代码
class Solution {
public:string reverseStr(string s, int k) {for (int i = 0; i < s.size() - 1; i += ( 2 * k )) {//如果剩余字符大于或等于k个if (i+k <= s.size()) {reverse(s.begin() + i,s.begin() + i + k);//反转前k个字符} else { //剩余字符少于k个reverse(s.begin() + i,s.end());//将剩余字符全部反转}}return s;}
};
时间复杂度:O(n);
空间复杂度:O(1);
替换数字
题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
思路
- C++中的string可以原地修改。
- 统计s中的数字个数,根据数字个数进行扩容。
- 使用双指针从扩容后的字符数组末尾开始填充。
- 一个指针指向原字符数组末尾,一个指针指向扩容后的字符数组末尾。
代码
#include<iostream>
using namespace std;
int main() {string s;while (cin >> s) {int sOldIndex = s.size() - 1;int count = 0;//用来统计字符数组中数字的个数//遍历字符数组,统计其中数字的个数for (int i = 0; i < s.size(); i++) {if (s[i] >= '0' && s[i] <= '9') {count++;}}//将字符串扩充到将数字替换成number之后的大小s.resize(s.size() + count * 5);int sNewIndex = s.size() - 1;//替换//从后往前将数字替换为number并填充到扩充后的字符数组中while (sOldIndex >= 0) {//如果当前字符为数字,替换if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') {s[sNewIndex--] = 'r';s[sNewIndex--] = 'e';s[sNewIndex--] = 'b';s[sNewIndex--] = 'm';s[sNewIndex--] = 'u';s[sNewIndex--] = 'n';} else {//不是数字s[sNewIndex--] = s[sOldIndex];}sOldIndex--;}cout << s << endl;}
}
时间复杂度:O(n);
空间复杂度:O(1);