代码随想录 | Day08 | 2023.12.19 | 字符串01

今日题目:

344. 反转字符串
541. 反转字符串 II
151. 反转字符串中的单词

今日总结

都可以秒杀了。但是要注意第二题精简代码的方法很巧妙。第三题思路很简单,但是要记得处理各种边界情况。

344. 反转字符串

要点

  1. 没啥说的,背成模板就行。

代码:

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

要点:

  1. 注意Go的切片特性 sub和result共享底层数组
  2. 这里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. 反转字符串中的单词

要点:

  1. 学会使用全局反转和局部反转。
  2. 另一要点在于处理边界情况。别忘了去除前后多余空格。
  3. 注意这里处理单词之间的空格的方法。
  4. 注意对于末尾单词要单独进行判断。
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
}
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值