leetcode 344. 反转字符串 541. 反转字符串 II 双指针解

130 阅读1分钟

目录

leetcode 344.反转字符串

1、题目

在这里插入图片描述

2、思考

典型的双指针解法:
一个从前往后,一个从后往前,指针对应的交换即可。

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

leetcode 541. 反转字符串 II

1、题目

在这里插入图片描述

2、思考

交换的基础部分还是和双指针有关,主要增加了逻辑上的复杂程度。
我的逻辑描述如下:
1、获取字符串长度(s_size )、并按照2k来划分组数(group_nums ),并且计算剩下来的不能组成一组的元素的个数(left_nums )
2、将翻转包装成函数,只要输入start 和end值即可
3、循环对组内的元素进行按照题目中的描述翻转,确定start 为该组第一个元素,end为start加上k,保证前k个元素翻转
4、对剩下的元素个数进行判断
5、如果剩余字符小于k个,start = (group_nums) * 2 * k,end为s最后一个字符
6、如果剩余字符小于2k个,start = (group_nums) * 2 * k,end=start+k

class Solution {
public:
    void myreverse(string& s, int start, int end)
    {
        while (start <= end)
        {
            char tmp = s[start];
            s[start] = s[end];
            s[end] = tmp;
            start++;
            end--;
        }
    }
    string  reverseStr(string s, int k) {
        int s_size = s.size();
        int group_nums = s_size / (2 * k);
        int count = group_nums;
        int left_nums = s_size - 2 * k * group_nums;
        while (count > 0)
        {
            int start = (count - 1) * 2 * k;
            int end = start + k - 1;
            myreverse(s, start, end);
            count--;
        }
        //剩下字符翻转
        if (left_nums < k)
        {
            int start = (group_nums) * 2 * k;
            int end = s_size - 1;
            myreverse(s, start, end);
        }
        else if (left_nums < 2 * k)
        {
            int start = (group_nums) * 2 * k;
            int end = start + k - 1;
            myreverse(s, start, end);
        }
        return s;
    }
};