代码随想录算法训练营第7天 | lc344、lc541、卡码54、lc151、卡码55

发布时间 2023-12-09 22:16:32作者: geJoyo

(本合集全部为Go语言实现)

相关文章链接:344题解 541题解 卡码54题解 151题解 卡码55题解
相关视频链接:

Leetcode344

状态:秒了
实现过程中的难点:对撞双指针

个人写法

func reverseString(s []byte)  {
  for i, j := 0, len(s) - 1; i < j; i, j = i + 1, j - 1 {
    s[i], s[j] = s[j], s[i]
  }
}

Leetcode541

状态:秒了
实现过程中的难点:印象比较深刻,这种跨度的题每次循环就直接加一个跨度,而不是自己去计数

个人写法

func reverseStr(s string, k int) string {
  arr := []byte(s)
  for i := 0; i < len(arr); i += 2 * k {
    m, n := i, i + k - 1
    if i + k - 1 >= len(arr) {
      n = len(arr) - 1
    }
    for m < n {
      arr[m], arr[n] = arr[n], arr[m]
      m, n = m + 1, n - 1
    }
  }
  return string(arr)
}

卡码54

状态:基本秒了,go语言的写法卡了一下
实现过程中的难点:基本就是利用各个语言的类似StringBuilder来实现

个人写法

卡码网的Golang版本好像是比较低,没有strings.Builder,但是可以采用低版本的bytes.Buffer平替一下

package main

import (
    "bytes"
    "fmt"
)

func main() {
    var s string
    fmt.Scanln(&s)
    
    var builder bytes.Buffer
    for _, c := range []byte(s) {
        if c >= 'a' && c <= 'z' {
            builder.WriteByte(c)
        } else {
            builder.WriteString("number")
        }
    }
    fmt.Println(builder.String())
}

Leetcode151

状态:比较耗时间
实现过程中的难点:翻转题目可以考虑转换为数组某个段落的翻转。本题我的思路是先将字符串中的单词间空格和首尾空格去除掉,并将每个单词做翻转,再把这部分整体做翻转,即可达成最终的效果

个人写法

func reverseWords(s string) string {
  slow, fast:= -1, 0
  arr := []byte(s)
  var start int
  for fast < len(s) {
    if arr[fast] != ' ' {
      arr[slow + 1] = arr[fast]
      slow++
      if slow > 0 && arr[slow - 1] == ' ' {
        start = slow
      }
      fast++
    } else {
      if slow >= 0 && arr[slow] != ' ' {
        arr[slow + 1] = ' '
        slow++
        for m, n := start, slow - 1; m < n; m, n = m + 1, n - 1 {
          arr[m], arr[n] = arr[n], arr[m]
        }
      } else {
        fast++
      }
    }
  }
  if (arr[slow] == ' ') {
    slow--
  } else {
    for m, n := start, slow; m < n; m, n = m + 1, n - 1 {
      arr[m], arr[n] = arr[n], arr[m]
    }
  }
  for m, n := 0, slow; m < n; m, n = m + 1, n - 1 {
    arr[m], arr[n] = arr[n], arr[m]
  }
  return string(arr[:slow + 1])
}

卡码55

状态:还可以
实现过程中的难点:原地旋转,需要快速想到转换成翻转的思路

个人写法

package main

import (
    "fmt"
)

func main() {
    var k int
    fmt.Scanln(&k)
    var s string
    fmt.Scanln(&s)
    
    arr := []byte(s)
    for i, j := 0, len(arr) - 1; i < j; i, j = i + 1, j - 1 {
        arr[i], arr[j] = arr[j], arr[i]
    }
    
    for i, j := 0, k - 1; i < j; i, j = i + 1, j - 1 {
        arr[i], arr[j] = arr[j], arr[i]
    }
    
    for i, j := k, len(arr) - 1; i < j; i, j = i + 1, j - 1 {
        arr[i], arr[j] = arr[j], arr[i]
    }
    
    
    fmt.Println(string(arr))
}

今日收获

  • 学习到了go的Builder的使用
  • 学到了字符串题目中,翻转是一个思路,可以作为变体题目的一个重要思路

学习时长:2小时左右