文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
相关文章:
- LeetCode:55. Jump Game(跳远比赛)
- Leetcode:300. Longest Increasing Subsequence(最大增长序列)
- LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)
文章目录:
给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
要求:
该字符串只包含小写的英文字母。
给定字符串的长度和 k 在[1, 10000]范围内。
java实现方式1:
/**
* 翻转字符串
*
* @param s 字符串s
* @param k k
* @return 字符串
*/
private String getReverseString(String s, int k) {
if (s.length() <= k) {
return new StringBuffer(s).reverse().toString();
}
if (s.length() > k && s.length() <= 2 * k) {
String subString = s.substring(0, k);
subString = new StringBuffer(subString).reverse().toString();
return subString + s.substring(k);
}
if (s.length() > 2 * k) {
LinkedList<String> list = new LinkedList<>();
StringBuffer sb = new StringBuffer();
int number = s.length() / k;
for (int i = 0; i < number; i++) {
list.add(s.substring(i * k, i * k + k));
}
if (number * k < s.length()) {
list.add(s.substring(number * k));
}
for (int index = 0; index < list.size(); index++) {
if (index % 2 == 0) {
String temp = new StringBuffer(list.get(index)).reverse().toString();
sb.append(temp);
} else {
sb.append(list.get(index));
}
}
return sb.toString();
}
return null;
}
时间复杂度:O(n)
空间复杂度:O(n)
python实现方式1:
def get_reverse_string(s, k):
# 当s字符串长度小于k的值
if len(s) <= k:
return s[::-1]
# 当字符串长度在k和2k之间
if len(s) > k and len(s) <= 2 * k:
temp_str = s[0: k]
return temp_str[::-1] + s[k:len(s)]
# 当字符串长度大于2*k
if len(s) > 2 * k:
list = []
sb = ''
number = len(s) // k
for i in range(number):
list.append(s[i * k:i * k + k])
if number * k < len(s):
list.append(s[number * k:len(s)])
for i in range(len(list)):
if i % 2 == 0:
sb += list[i][::-1]
else:
sb += list[i]
return sb
return '-1'
时间复杂度:O(n)
空间复杂度:O(n)
java实现方式2.
/**
* 翻转字符串
*
* @param s 字符串s
* @param k k
* @return 字符串
*/
public String reverseStr2(String s, int k) {
LinkedList<String> list = new LinkedList<>();
StringBuffer sb = new StringBuffer();
int number = s.length() / k;
for (int i = 0; i < number; i++) {
list.add(s.substring(i * k, i * k + k));
}
if (number * k < s.length()) {
list.add(s.substring(number * k));
}
for (int index = 0; index < list.size(); index++) {
if (index % 2 == 0) {
String temp = new StringBuffer(list.get(index)).reverse().toString();
sb.append(temp);
} else {
sb.append(list.get(index));
}
}
return sb.toString();
}
时间复杂度:O(n)
空间复杂度:O(n)
python方法实现2:
def get_reverse_string(s, k):
list = []
sb = ''
number = len(s) // k
for i in range(number):
list.append(s[i * k:i * k + k])
if number * k < len(s):
list.append(s[number * k:len(s)])
for i in range(len(list)):
if i % 2 == 0:
sb += list[i][::-1]
else:
sb += list[i]
return sb
时间复杂度:O(n)
空间复杂度:O(n)