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

344.反转字符串

比较简单

541. 反转字符串II

一开始自己的逻辑没写通,记录一下

1. 注意传参的时候要引用,别忘了

class Solution {
public:
    //一开始自己写的,没跑通
    //反转字符串的一部分,m是初始下标,n是结束下标
    void reverse(string& s,int m,int n)
    {
        int loop=(n-m+1)/2;
        while(loop)
        {
            swap(s[m],s[n]);
            m++;
            n--;
            loop--;
        }

    }
    string reverseStr(string s, int k) {
        //做循环计数,剩下的字符可以if直接判断
        int count=0;
        for(int i=0;i<s.size();i++)
        {
            if((i+1)%(2*k)==0)
            {
                /*
                reverse(s,i/2-k,i/2);
                i/2不能这么写,不是折半
                */
                reverse(s,i-2*k+1,i-2*k+1+k);
                count++;
            }
        }
        //通过count计算出剩余元素多少个
        int residue=s.size()-count*2*k;
        if(residue<k)
        {
            //反转剩下所有
            reverse(s,count*2*k+1,s.size()-1);
        }
        else
        {
            //反转前k个
            reverse(s,count*2*k+1,count*2*k+1+k);
        }
        return s;
    }
};
class Solution {
public:
    //反转字符串的一部分,m是初始下标,n是结束下标
    //string& s才行,不然没有改变数值。注意要引用
    void reverse(string& s,int m,int n)
    {
        int loop=(n-m+1)/2;
        while(loop)
        {
            swap(s[m],s[n]);
            m++;
            n--;
            loop--;
        }

    }
    string reverseStr(string s, int k) {
        //做循环计数,剩下的字符可以if直接判断
      
        for(int i=0;i<s.size();i=i+2*k)
        {
            //这两句有点没想明白
            if(i+k<=s.size())
            {
                reverse(s,i,i+k-1);    
            }
            //
            else
            {
                reverse(s,i,s.size()-1);    
            }
                                 
        }

        return s;
    }
};

卡码网:54.替换数字

次日补的

1. 在字符串或者数组中,扩展长度,并替换元素,使用双指针法的时候,从后面往前面填充,减少时间复杂度

2. 字符串string和 vector有点像,是可以扩容的。 s.resize(扩容后的长度)

3. 字符串string的使用和其库函数都不太熟悉

#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++;
            }
        }
        
        s.resize(s.size()+count*5);
        int snewindex=s.size()-1;
        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';
                soldindex--;
            }
            else
            {
                s[snewindex--]=s[soldindex--];
                
            }
        }
        
        cout<<s<<endl;
    }
    
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值