【刷题打卡】541. 反转字符串 II

112 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

541. 反转字符串 II - 力扣(LeetCode) (leetcode-cn.com)

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

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

示例 1:

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

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

提示:

  • 1 <= s.length <= 10^4
  • s 仅由小写英文组成
  • 1 <= k <= 10^4

二、思路分析:

双指针,start指向要翻转的字符串的开头,end指向结尾,然后只要判断剩余字符的个数即可 若剩余字符数少于k个,即len - start - 1 < k,则end设为len - 1,调用函数翻转 其他情况,end直接设为start+k-1,然后调用函数即可 更新start = start + 2*k;

三、AC 代码:

void reverse(char *s, int start, int end)
{
    int i = start,j = end;
    char temp;
    while(i < j)
    {
        temp = s[i];
        s[i] = s[j];
        s[j] = temp;
        i++;
        j--;
    }
}
char * reverseStr(char * s, int k){
    int len = strlen(s),start = 0,end;
    while(start < len)
    {
        if(len - start - 1 < k) end = len - 1;
        else end = start + k - 1;
        reverse(s,start,end);
        start = start + 2*k;
    }
    return s;
}

四、总结:

双指针,直接模拟即可。

范文参考:

Rust大法 - 反转字符串 II - 力扣(LeetCode) (leetcode-cn.com)