344.反转字符串● 题目链接:344.反转字符串● 独立思路:n=s.size(),用i遍历0~n/2,用char temp当缓冲器,让s[i]与s[n-i-1]交换数值● 时间复杂度:O(nv

文章介绍了C++中的四种字符串操作:反转字符串、每k个字符反转、替换数字、翻转单词和右旋转字符串,涉及基本的算法实现和时间空间复杂度分析。
摘要由CSDN通过智能技术生成

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++ 中,stringsize() 函数返回一个 size_type 类型的值,通常是无符号类型(如 unsigned intunsigned 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.右旋转字符串

(独立思路:❌ 将后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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值