代码随想录算法训练营第八天| leetcode 344、541、卡码网54

反转字符串 leetcode 344

class Solution {
public:
    void reverseString(vector<char>& s) {
        int index1=0,index2=s.size()-1;
        char tmp;
        while(index1<index2){
            tmp=s[index1];
            s[index1]=s[index2];
            s[index2]=tmp;
            index1++;
            index2--;
        }
    }
};

操作字符串和数组原理一致,双指针思想。

总结

交换的时候可以使用swap(s[index1],s[index2]);

class Solution {
public:
    void reverseString(vector<char>& s) {
        int index1=0,index2=s.size()-1;
        while(index1<index2){
            swap(s[index1],s[index2]);
            index1++;
            index2--;
        }
    }
};

反转字符串Ⅱ leetcode 541

class Solution {
public:
    string reverseStr(string s, int k) {
        for(int i=0;i<s.size();i+=2*k){
            if(i+k<s.size()){
                reverse(s.begin()+i,s.begin()+i+k);
                continue;
            }
            reverse(s.begin()+i,s.end());
        }
        return s;
    }
};

题目描述,每计数至2k个字符,就反转这2k字符中的前k个字符。所以我们for循环遍历时直接一次2k个遍历(i+=2*k),首先把每部分2k的前k个字符反转,然后直接continue进入下一次循环,使用if语句是为了把最后不足2k但大于k的情况合并进来,如果不满足if语句的条件就说明最后一段长度不足2k且小于k,最后一段直接全部反转。

总结

1.reverse(s.begin()+i,s.begin()+i+k);将字符串s从索引i到(i+k-1)的元素反转,C++库函数保持左开右闭原则。

替换数字 卡码网 54

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string s;
    while(cin>>s){
        int count=0;
        int oldSize=s.size()-1;
        for(int i=0;i<s.size();i++){
            if(s[i]<='9'&&s[i]>='0'){
                count++;
            }
        }
        
        s.resize(s.size()+count*5);
        int newSize=s.size()-1;
        while(oldSize>=0){
            if(s[oldSize]<='9'&&s[oldSize]>='0'){
                s[newSize--]='r';
                s[newSize--]='e';
                s[newSize--]='b';
                s[newSize--]='m';
                s[newSize--]='u';
                s[newSize--]='n';
            }else{
                s[newSize--]=s[oldSize];
            }
            oldSize--;
        }
    }
    cout<<s<<endl;
}

先计算输入字符串中数字个数,再对字符串大小进行扩容。然后新数组指针指向新数组末尾,旧数组指针指向旧数组末尾,如果旧数组指针指向的是数字就从后往前对新数组依次赋值“number”,如果旧数组指针指向的是字母就将这个字母添加到新数组中。

总结

1.新数组从后向前填充避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

2.while(cin>>s),当输入流cin成功读取一个字符串到s变量时,就执行循环体内的代码。这个循环会一直持续直到从cin读取字符串失败。

3.s.resize(newSize);改变字符串大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值