今日题目:
344. 反转字符串
541. 反转字符串 II
151. 反转字符串中的单词
今日总结
都可以秒杀了。但是要注意第二题精简代码的方法很巧妙。第三题思路很简单,但是要记得处理各种边界情况。
344. 反转字符串
要点
- 没啥说的,背成模板就行。
代码:
func reverseString(s []byte) {
for i :=0 ; i<len(s)/2; i++{
s[i], s[len(s)-1-i] = s[len(s)-1-i], s[i]
}
return
}
541. 反转字符串 II
要点:
- 注意Go的切片特性 sub和result共享底层数组
- 这里sub的赋值很精妙,有效减少了代码行数
func reverseStr(s string, k int) string {
result := []byte(s)
for i :=0 ; i < len(s); i += 2*k {
sub := result[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(result) //sub的改变也会影响result
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
151. 反转字符串中的单词
要点:
- 学会使用全局反转和局部反转。
- 另一要点在于处理边界情况。别忘了去除前后多余空格。
- 注意这里处理单词之间的空格的方法。
- 注意对于末尾单词要单独进行判断。
func reverseWords(s string) string {
start, end := 0, len(s)-1 //去除前后空格
for s[start] ==' ' {
start++
}
for s[end] == ' ' {
end--
}
var result []byte
for i := start; i <= end; i++ { //去除中间多余空格
if s[i] != ' ' || (i > 0 && s[i-1] != ' ') {
result = append(result, s[i])
}
}
reverse(result)
curWordStart := 0
for i := 0 ;i <= len(result);i++{
if i == len(result) || result[i] ==' ' {
reverse(result[curWordStart:i])
curWordStart = i+1
}
}
return string(result)
}
func reverse(s []byte) []byte {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
return s
}