给定一个字符串 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
参考官方答案的文字题解后的代码:
func reverseStr(s string, k int) string {
l := len(s)
str := []byte(s)//把字符串转换为数组
for m := 0; m < l; m += 2 * k{
if m + k - 1 >= l{
for l, r := m, l - 1; l < r; l++{
str[l], str[r] = str[r], str[l]
r--
}
}else{//m + k - 1 < l
for l, r := m, m + k - 1; l < r; l++{
str[l], str[r] = str[r], str[l]
r--
}
}
}
return string(str)
}
官方题解:
前置知识:
模拟
模拟算法,用一句老话说,就是“照着葫芦画瓢”;官方化的诠释则是:根据题目表述进行筛选提取关键要素,按需求书写代码解决实际问题。
模拟是对真实事物或者过程的虚拟。在编程时为了实现某个功能,可以用语言来模拟那个功能,模拟成功也就相应地表示编程成功。
模拟算法的思路
模拟算法是一种基本的算法思想,可用于考查程序员的基本编程能力,其解决方法就是根据题目给出的规则对题目要求的相关过程进行编程模拟。在解决模拟类问题时,需要注意字符串处理、特殊情况处理和对题目意思的理解。
在C语言中,通常使用函数srand()和rand()来生成随机数。其中,函数srand()用于初始化随机数发生器,然后使用函数rand()来生成随机数。如果要使用上述两个函数,则需要在源程序头部包含time.h文件。在程序设计过程中,可使用随机函数来模拟自然界中发生的不可预测情况。在解题时,需要仔细分析题目给出的规则,要尽可能地做到全面考虑所有可能出现的情况,这是解模拟类问题的关键点之一。
当题目很难用计算机建立枚举、贪心等算法,甚至无法建立数学模型的时候就可以用模拟法:用计算机模拟整个进程进而得到答案。
模拟题的算法一般都不太复杂,关键是所有条件都不能遗漏并要把条件分析清楚。求解模拟题一般都比较繁琐,编程前一定要预先规划好各个模块的功能和结构,以免具体编程时注意了局部而遗漏了某些重要的方面。
方法一:模拟
我们直接按题意进行模拟:反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。
func reverseStr(s string, k int) string {
t := []byte(s)
for i := 0; i < len(s); i += 2 * k {
sub := t[i:min(i+k, len(s))]
for j, n := 0, len(sub); j < n/2; j++ {
sub[j], sub[n-1-j] = sub[n-1-j], sub[j]
}
}
return string(t)
}
func min(a, b int) int {
if a < b {
return a
}
return b
}