代码随想录算法训练营第八天|344.反转字符串,541. 反转字符串II,卡码网:54.替换数字

必须要开始继续刷算法啦!不然机试要烂啦!!!

344.反转字符串

题目链接:344. 反转字符串 - 力扣(LeetCode)

题目要求用o(1)的时间复杂度完成字符串反转,这个题感觉没什么难度,就是找到一个中间数,然后对称交换元素即可。不过字符串反转的模板后面的很多题目都要用上的。
 

class Solution {
public:
    void reverseString(vector<char>& s) {
        int len=s.size();
        int mid=len/2-1;
        for(int i=0;i<=mid;i++)
        {
            swap(s[i],s[len-i-1]);
        }
    }
};

541.反转字符串II

题目链接:541. 反转字符串 II - 力扣(LeetCode)

这个题目就比较复杂了,他有三种情况需要解决:

1.字符串剩余字符数量大于等于2k时,翻转前k个字符

2.字符串剩余字符数量大于等于k且小于2k,反转前k个字符串

3.字符串剩余字符数量小于k,全部进行翻转

其实分析一下就可以整合成两种情况:

1.字符串剩余字符数量大于等于k,反转前k个

2.字符串剩余字符数量小于k,全部翻转

按照这个思路去写就很好解决了。

class Solution {
public:
    void reverse_string(string& s, int start, int end) {
        int mid = (end - start + 1) / 2 - 1;
        for (int i = 0; i <= mid; i++) {
            swap(s[start + i], s[end - i]);
        }
    }
    string reverseStr(string s, int k) {
        int i = 0;
        while (i < s.size()) {
            if (s.size() - i >= k) {
                int end = i + k;
                int mid = (i + end + k) / 2 - 1;
                reverse_string(s, i, i + k - 1);
                i = i + 2 * k;
            } else {
                int end = s.size() - 1;
                reverse_string(s, i, end);
                i = i + 2 * k;
            }
        }
        return s;
    }
};

卡码网:54.替换数字

题目链接:54. 替换数字(第八期模拟笔试) (kamacoder.com)

输入一个字符串包含字母和数字,形式类似于"a1b2c3",需要把字符串里面的数字转换成字符串"number"

理论上最好的做法是原地做,我是开了一个新数组做的。可能不是最优的做法,但也AC了。

#include<iostream>
using namespace std;
int main()
{
    string str;
    string s="";
    cin>>str;
    for(int i=0;i<str.size();i++)
    {
        if(str[i]>='1'&&str[i]<='9') s+="number";
        else s+=str[i];
    }
    cout<<s<<endl;
    return 0;
}

从今天开始,算法训练一定要坚持每天做。加油加油加油!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值