反转字符串 II
难度:
标签:
题目描述
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
提示:
1 <= s.length <= 104
s
仅由小写英文组成1 <= k <= 104
代码结果
运行时间: 19 ms, 内存: 16.0 MB
/*
* 题目思路:
* 使用 Java Stream 实现类似的反转逻辑。我们仍然需要按照每 2k 个字符进行操作,
* 并对前 k 个字符进行反转。
*/
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public String reverseStr(String s, int k) {
return IntStream.range(0, s.length())
.mapToObj(i -> new AbstractMap.SimpleEntry<>(i, s.charAt(i)))
.collect(Collectors.groupingBy(e -> e.getKey() / (2 * k)))
.values().stream()
.flatMap(group -> {
List<Map.Entry<Integer, Character>> subList = new ArrayList<>(group);
int limit = Math.min(k, subList.size());
IntStream.range(0, limit / 2).forEach(j -> {
Collections.swap(subList, j, limit - j - 1);
});
return subList.stream();
})
.sorted(Map.Entry.comparingByKey())
.map(Map.Entry::getValue)
.map(String::valueOf)
.collect(Collectors.joining());
}
}
解释
方法:
该题解采用遍历字符串的方式,每次步进2k个字符,处理每个分段。对每个分段的前k个字符进行反转,并将反转后的字符串与该分段的后k个字符(如果存在)相连,累加到结果字符串中。这样可以确保每次处理都符合题目的要求,即每2k个字符中的前k个字符被反转,后k个字符保持不变。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在遍历的过程中,如何确保代码正确处理字符串最后的字符,特别是当字符串长度不是2k的倍数时?
▷🦆
对于长度极小或极大的k值(接近1或104),有没有可能导致性能问题?如果有,如何优化?
▷🦆
在实际的字符串操作中,是否考虑了Python字符串的不可变特性对性能的影响?如果考虑了,是如何优化的?
▷🦆
代码中对于`i + k`和`i + 2 * k`范围超出字符串长度的情况有没有做特殊处理?如果没有,Python是如何处理这种情况的?
▷