首页 > 编程语言 >代码随想录算法训练营第八天| leetcode 344、541、卡码网54

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

时间:2024-07-12 22:56:42浏览次数:10  
标签:卡码 newSize int 54 随想录 -- 数组 字符串 2k

反转字符串 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);改变字符串大小。

标签:卡码,newSize,int,54,随想录,--,数组,字符串,2k
From: https://blog.csdn.net/hty123hty/article/details/140316314

相关文章