力扣算法-Day20

541. 反转字符串II

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

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

力扣算法-Day20_第1张图片

思路:双指针。

分情况讨论:

  1. 2k的整数倍 
  2. 剩余字符少于 k 
  3. 剩余字符小于 2k 但大于或等于 k 

具体实现代码:

void swap(char* a, char* b) {
    char temp = *a;
    *a = *b;
    *b = temp;
}
char* reverseStr(char* s, int k) {
    int len = strlen(s);
    int left;
    for (left = 0; left + 2*k <= len;) {
        //下一次的位置
        int nextLeft = left+2*k;
        int right = left + k - 1;
        while (left < right) {
            swap(&s[left],&s[right]);
            left++;
            right--;
        }
        left = nextLeft;
    }
    if (len - left < k) {
        int right = len - 1;
        while (left < right) {
            swap(&s[left],&s[right]);
            left++;
            right--;
        }
    } else {
        int right = left + k - 1;
        while (left < right) {
            swap(&s[left],&s[right]);
            left++;
            right--;
        }
    }
    return s;
}

 这一期专栏记录将我每天的刷题,希望各位的监督,也希望和各位共勉。

追光的人,终会光芒万丈!!

你可能感兴趣的:(力扣刷题,leetcode,算法,数据结构)