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

108 阅读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

二、思路分析:

这题实际上是判断当前索引+k <= len即可,然后如果剩余字符足够k个,则对k个字符进行翻转;

不足k个,则翻转所有剩余字符;

然后索引+= 2k即可

三、AC 代码:

char * reverseStr(char * s, int k){
    int len = strlen(s);
    int i, j, l;
    for (i = 0; i < len; ) {
        if (i + k <= len) { // 前k个进行反转
            for (j = i, l = i + k - 1; j < l; j++, l--) {
                char tmp = s[j];
                s[j] = s[l];
                s[l] = tmp;
            }
        } else {    // 剩余字符进行反转
            for (j = i, l = len - 1; j < l; j++, l--) {
                char tmp = s[j];
                s[j] = s[l];
                s[l] = tmp;
            }
        }
        i += 2 * k;
    }
    return s;
}

四、总结:

这题题目有点难懂,需要好好审题。

范文参考:

[南瓜写题解]leetcode 541. 反转字符串 II - 反转字符串 II - 力扣(LeetCode) (leetcode-cn.com)