344.反转字符串
- 题目链接:344.反转字符串
- 独立思路:n=s.size(),用i遍历0~n/2,用char temp当缓冲器,让s[i]与s[n-i-1]交换数值
- 时间复杂度:O(n)
- 空间复杂度:O(1)
//想法:n=s.size(),用i遍历0~n/2,用char temp当缓冲器,让s[i]与s[n-i-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-i-1];
s[n-i-1] = temp;
}
}
};
541. 反转字符串II
题目出得很乱,不如看简化版:通俗一点说,每隔k个反转k个,末尾不够k个时全部反转;
- 题目链接:541. 反转字符串II
- 独立思路:每个2k个,逆转
s.begin()+i到s.begin()+i+k
,当最后不到2k个了,有k个反转k个,没有k个就全部反转,即逆转s.begin()+i到min(s.begin()+i+k, s.end())
- 时间复杂度:O(n)
- 空间复杂度:O(1)
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size();
for(int i = 0; i < n; i += 2*k){
reverse(s.begin()+i,min(s.begin()+i+k, s.end()) );
}
return s;
}
};
卡码网:54.替换数字
- 题目链接:卡码网:54.替换数字
- 独立思路:❌没想出来咋区分字母和数字(可以用isdigit函数判断是否为数字)
- 问题(已解决):string的size不能用int来接收。在 C++ 中,string 的 size() 函数返回一个 size_type 类型的值,通常是无符号类型(如 unsigned int 或 unsigned long)。而 int 是有符号类型。当一个 string 的长度超过 int 能表示的最大值时(大约 2.1 亿个字符),使用 int 接收 size() 的返回值可能会导致溢出或不正确的值。
- 时间复杂度:O(n)
- 空间复杂度:O(1)
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
class Solution {
public:
string substitute(string s) {
for (unsigned int i = 0; i < s.size(); i++) {
if (isdigit(s[i])) {
s.replace(i, 1, "number");
i += 5; // After replacing with "number", skip next 5 characters
}
}
return s;
}
};
int main() {
Solution solution;
string input;
// cout << "输入字符: "; //在特定编译器情况下不需要输入这行
getline(cin, input); // Get user input
string output = solution.substitute(input);
cout << output << endl; // Output the result
return 0;
}
151.翻转字符串里的单词
- 题目链接:151.翻转字符串里的单词
- 独立思路:❌ 没思路
- 题解:1. 不管原本的空格,扫描到一个单词->放入属于它的位置->加一个空格->继续扫描。2. 一个单词放入,就对其进行逆转:olleh dlrow。扫描完字符串之后,剩下的多余空间全部删除 3. 最后对整体逆转:world hello
- 时间复杂度:O(n)
- 空间复杂度:O(1)
//不管原本的空格,扫描到一个单词->放入属于它的位置->加一个空格->继续扫描
//一个单词放入,就对其进行逆转:olleh dlrow。最后对整体逆转:world hello
class Solution {
public:
string reverseWords(string s) {
// 忽略多余空格
int storeIndex = 0, n = s.size(); //storeIndex是新的存储位置
for (int i = 0; i < n; ++i) {
if (s[i] != ' ') {
if (storeIndex != 0) //当新的存储位置已经不为0,第一个单词已经存入,需要空格再存入下个单词
s[storeIndex++] = ' ';
int j = i;
while (j < n && s[j] != ' ') //将单词放入应该在的位置
s[storeIndex++] = s[j++];
reverse(s.begin() + storeIndex - (j - i), s.begin() + storeIndex); //单个单词逆转
i = j; //i更新为存入单词的最后一个字母位置
}
}
s.erase(s.begin() + storeIndex, s.end()); //剩下多余的空间全部删除
// 反转整个字符串
reverse(s.begin(), s.end());
return s;
}
};
卡码网:55.右旋转字符串
- 题目链接:卡码网:55.右旋转字符串
(独立思路:❌ 将后k个字符存到新数组,前n-k个字符后移,再将新数组的字符存回旧的字符串)
- 题解:用substr(代码可以运行但是一直答案错误不知道为啥)
- 时间复杂度:O(n)
- 空间复杂度:O(1)
#include <string>
#include <iostream>
using namespace std;
class Solution{
public:
string moveRight(string s, int k){
if(k <= 0)
return s;
int n = s.size();
k = k%n; //确保移动的字符数<n (k/n的移动都是回到原位)
return s.substr(n-k)+s.substr(0, n-k);
//s.substr(n-k) 是截取从n-k到结尾(n-1)的子串
//s.substr(0, n-k) 0为startindex,n-k为length
}
};
int main(){
Solution solution;
string input;
int k;
string output = solution.moveRight(input, k);
cout << output << endl;
return 0;
}