programmercarl.com/0541.%E5%8F...
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符,再重新计数。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
示例 1:
ini
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
示例 2:
ini
输入: s = "abcd", k = 2
输出: "bacd"
提示:
1 <= s.length <= 104s仅由小写英文组成1 <= k <= 104
这道题目其实也是模拟,实现题目中规定的反转规则就可以了。
一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。
其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。
所以当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。
kotlin
class Solution {
fun reverseStr(s: String, k: Int): String {
if (k == 1) return s
val charArray = s.toCharArray()
for (i in 0..<s.length step 2 * k) {
var start = i
// 判断尾数够不够k个来取决end指针的位置
var end = (s.length - 1).coerceAtMost(start + k - 1)
while (start < end) {
val temp = charArray[start]
charArray[start] = charArray[end]
charArray[end] = temp
start++
end--
}
}
return String(charArray)
}
}
- 时间复杂度: O(n)
- 空间复杂度: O(1)或O(n), 取决于使用的语言中字符串是否可以修改.