代码随想录打卡第八天 | 字符串 leetcode344&541&151 卡码网54&55

目录

344 - 反转字符串

思路:

提交代码

541 - 反转字符串 II

思路:

提交代码

151 - 反转字符串中的单词

思路:

提交代码

卡码网54&55(已经凌晨12:13了,这两个题周末复习时再做。。。)


 

344 - 反转字符串

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

思路:

1、类似于双指针的方法,左指针指向0, 右指针指向s.size() - 1(最后一位)

2、左右数据交换;

3、左右指针相向而行,直到左指针>=右指针退出;

提交代码

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

541 - 反转字符串 II

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。

  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

思路:

1、计算有多少个2K;                                s.size()/k;

2、剩余数据长度len<k, 还是k<len<2k       s.size()%k;

3、处理数据;

思路就是这样,但是写的时候有很多坑,都是必须自己一个个踩过去的。。。我写了一个多小时才通过。。。。后面再找找有没有什么简便方法(分成一个个子串分别处理应该会更简单!!!)

提交代码

class Solution {
public:
    string reverseStr(string s, int k) {
        int size = s.size();
        if(size < k){
            for(int i = 0; i < size/2; ++i){//size < k反转全部
                swap(s[i], s[size - 1 - i]);
            }
            return s;
        }
        else if(size >= k && size < 2 * k){//k <= size < 2k反转前k个
            for(int i = 0; i < k/2; ++i){
                    swap(s[i], s[k - 1 - i]);
            }
            return s;
        }
        else if(size >= 2 * k){
            int rest = size % (2*k);
            int idx = 0;    //当前遍历第几个2k
            int last = size - 1 - (size % k);     //最后一个需要反转的元素下标
            for(int i = 0; i < s.size(); ++i){//
                if((s.size() - i - 1) < rest){//遍历到rest范围了
                    if(rest >= k && i <= last){   //k <= len < 2k,反转前k个
                        swap(s[i], s[last--]);
                    }
                    else if (rest >= k && i > last){//k <= len < 2k,前k个之外不反转
                        break;
                    }
                    else if(rest < k){   // len < k  全部反转
                        if(i < size - 1 -i%k){
                            swap(s[i], s[size - 1 - i%k]);
                        }
                    }
                }
                else{   //n * 2k范围内
                    idx = i / (2 * k) + 1;
                    int last = idx * 2 * k - 1; //n * 2k的最后一位下标
                    if(i < last - k - i%(2*k)){
                        swap(s[i], s[last - k - i%(2*k)]);
                    }
                }
            }
        }
        return s;
    }

    void test(){
        reverseStr( "abcdefg", 2);
    }
};

151 - 反转字符串中的单词

输入:s = "the sky is blue"
输出:"blue is sky the"

输入:s = "  hello world  "
输出:"world hello"

输入:s = "a good   example"
输出:"example good a"

思路:

1、本题看起来简单,使用数组分别存储子串再反转,但实际上有很多坑;

2、比如:空格,原来字符串中带多个空格,你反转后不同单词间隔只能有一个空格:

                原来字符串的前后带空格,你处理之后的不能带,比如:"the abc is good ", 你必须把good后面的‘ ’去掉,但是它也会出现"the abd is good", "the abc   is    good","  the abc   is good   ",各种情况,空格‘ ’可能出现在任何位置,要针对空格做很多特殊处理!!

提交代码


class Solution {
public:
    string reverseWords(string s) {
        vector<string> vec;
        int start = 0;
        // int end = 0;
         for(int i = 0; i < s.size(); ++i){
            if(s[i] == ' '){
                if(i != 0)  //第一个字符为空格不能插入
                    vec.emplace_back(string(s.begin() + start, s.begin() + i));
                start = i + 1;
                while(s[start] == ' '){ //"the abs   ddd" 出现多个空格,开始位置后移找到第一个非空格
                    ++start;
                    i = start;
                }
            }
            if(i == s.size() - 1){
                int end = s.size() - 1;
                if(start <= end){    //start < end说明还有最后一个单词需要拷贝,如“the sbhc t ”
                    //到了sbhc之后这个‘ ’处,此时还需要将t放入vec
                    while(s[end] == ' '){   //最后一个为空格,往前移动一格
                        end--;
                    }
                    vec.emplace_back(string(s.begin() + start, s.begin() + end + 1));
                }
                else if(start > end){  //start >= end 说明最后一个单词不用拷贝了,如“the sbhc tt ”,
                    //到了“tt”之后的‘ ’处,此时"tt"已经放入vec, start > end
                    break;
                }

            }
        }

        for(int i  = 0; i < vec.size()/2; ++i){
            swap(vec[i], vec[vec.size() - 1 - i]);
        }

        string out = "";
        for(int i  = 0; i < vec.size(); ++i){
            out += vec[i];
            if(i < vec.size() - 1)
            out += " ";
        }

        return out;
    }

    void test(){
        reverseWords(" asdasd df f");
    }
};

卡码网54&55(已经凌晨12:13了,这两个题周末复习时再做。。。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁中棠ang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值