剑指offer day3

96 阅读1分钟

刷题计划(第3天)

时间:2022.4.18

题数:2

题目类型:字符串

1.左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

第一次尝试了最简单的方法,和408上面的递归一样,运用多次旋转来实现目的

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        if(s.length()==1) return s;
        
        reverse(s.begin(),s.begin()+n);
        reverse(s.begin()+n,s.end());
        reverse(s.begin(),s.end());

        return s;
    }
};

image.png

击败了61%,目前来看算是空间复杂度比较低的了

2.替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

image.png

刚开始想用replace函数,后面发现c++的函数适合不太适合这道题,于是按照常规的先增加字符串的长度,然后从头开始修改,后面发现时间复杂度爆炸,后面优化为从尾到头得到算法。代码如下:

class Solution {
public:
    string replaceSpace(string s) {
        int count=0;//统计空格的个数
        int oldsize=s.size();
        for(int i=0;i<s.length();i++){
            if(s[i]==' '){
                count++;
            }
        }
        if(count==0) return s;//判断特殊情况
        s.resize(s.size()+count*2);
        int newsize=s.size();//这里先将长度换成填充后的长度
        for(int i=oldsize-1,j=newsize-1;i<j;j--,i--){
            if(s[i]!=' '){
                s[j]=s[i];
            }else{
                s[j]='0';
                s[j-1]='2';
                s[j-2]='%';//注意这里是后到前
                j-=2;
            }
        }
        return s;
    }
};

image.png

还有使用迭代器来访问c++的方法,这里笔者不了解,有意向的可以去leetcode的评论区去了解下

总结

串的增删改查,递归的应用,还有408的原题改编