开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
一、题目描述:
给定一个字符串 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)