leetcode算法541. 反转字符串 II

93 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

一、题目描述:

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

给定一个字符串 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;
}

四、总结:

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

说是啰嗦是因为感觉不用 if..else 嵌套也是可以的, 也不用强转成 Array , 但对语法不太熟悉, 思路正确就好了

范文参考:

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

第奇数个K子串逆序,第偶数个K子串正序,遍历完一个K子串就加到结果中 - 反转字符串 II - 力扣(LeetCode)

分两步。先解决重复的部分,再解决剩下的部分。 - 反转字符串 II - 力扣(LeetCode)