算法day23 反转字符2

题目描述

思路:双指针
对于本题,我们可以先求解出我们能够完整遍历的2k的次数,随后再处理余下的长度不足2k的部分。在处理的过程中,我们将左右指针置于要遍历范围的两侧,使指针向中间移动,通过临时变量来辅助字符的互换。

代码如下:

    string reverseStr(string s, int k) {
    int cnt1 = s.size()/(2*k);//计算2k长度的遍历次数
    int cnt2 = s.size()%(2*k);//计算余下的部分
    int left = 0;
    int right = s.size() > k ? k-1:s.size()-1;//初始化right,这里要考虑字符数组本身就长度不足k的情况 
    char temp;
    int i = 0;//用来记录第几组2k区间,由0开始
    while(cnt1--){
        i++;
        while(left<right){
            temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--; 
        }
        left  = (2*k)*i;
        right = k-1+left;
    }
    if(cnt2>k){
        left  = (s.size()/(2*k))*(2*k);
        right = k-1+left;
          while(left<right){
            temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--; 
        }
    }else{
        left = (s.size()/(2*k))*(2*k);
        right = s.size()-1;
          while(left<right){
            temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--; 
        }
    }

    return s;

}

2k步长版本(本质上没什么区别)

    string reverseStr(string s, int k) {
    int len = s.size();
    int left;
    int right;
    char temp;
    for(int i=0;i<len;i+=2*k){
        if(i+k<=s.size()){
            left = i;
            right = i+k-1;
            while(left<right){
            temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--; 
        }
            continue;
        }
            left = i;
            right = s.size()-1;
            while(left<right){
            temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--; 
        }
    }
    return s;
}

时间复杂度:O(n)
空间复杂度:O(1)

END

posted on 2025-04-30 14:42  sakura430  阅读(11)  评论(0)    收藏  举报