[代码随想录]Day07-字符串 part01

题目:344. 反转字符串

思路:

每次把最前面和最后面的交换位置即可

strings库里没有反转的方法

——这个反转是之后几个题的一个基础

代码:

双指针调换位置

func reverseString(s []byte)  {
    l, r := 0, len(s) - 1 // 最前面的元素,最后面的元素
    for l < r {
        s[l], s[r] = s[r], s[l] // 调换位置
        l++
        r--
    }
}

参考:

代码随想录

题目:541. 反转字符串 II

思路:

首先,这道题的难点在于对Go的字符串理解,Go的字符串不能修改,所以首先要转换成string类型。

而且要注意的一点是[]byte是切片类型,它的底层是数组指针,因此reverse传进去的参数是会修改的。

之后就是记得转换回string类型

代码:

func reverseStr(s string, k int) string {
    lens := len(s)
    ss := []byte(s) // 转换成[]byte进行操作
    for i := 0 ;i < lens ; i += 2 * k{ // 每次都要加2*k
        if lens - i >= k { // 如果剩余的数量大于k那就把前k个翻转
            reverse(ss[i:i+k]) 
        }else { // 剩下的不足k,全部翻转
            reverse(ss[i:])
        }
    }
    return string(ss) // 转换回string
}

func reverse(s []byte){
    l, r := 0, len(s) - 1
    for l < r {
        s[l], s[r] = s[r], s[l]
        l++
        r--
    }
}

参考:

代码随想录

题目:剑指 Offer 05. 替换空格

思路:

方法一:遍历一遍,遇到空格,添加"%20"

方法二:使用stringsReplace方法——func Replace(s, old, new string, n int) string;其中s是要进行操作的字符串,old是替换前的字段,new是替换后的字段,n是替换的个数(-1就是全部)。

方法三:直接进行修改,增加长度,然后从后向前遍历。

代码1:

遍历

func replaceSpace(s string) string {
    res := "" // 结果
    for i := 0; i < len(s); i++ { // 遍历
        if s[i] == ' ' {  // 单个是byte类型
            res += "%20"
        }else{
            res += string(s[i]) // 转换成string类型
        }
    }
    return res
}

代码2:

函数

func replaceSpace(s string) string {
    s = strings.Replace(s," ","%20",-1) // 把s中的" "全部替换成"%20"
    return s
}

参考:

代码随想录

题目:151. 反转字符串中的单词

思路:

方法一:在原字符串修改,解题思路如下:

  • 移除多余空格
  • 将整个字符串反转
  • 将每个单词反转

举个例子,源字符串为:"the sky is blue "

  • 移除多余空格 : "the sky is blue"
  • 字符串反转:"eulb si yks eht"
  • 单词反转:"blue is sky the"

方法二:调用库函数

方法三:遍历,找到每个单词然后添加到结果中

代码1:

调用库

func reverseWords(s string) string {
    t := strings.Fields(s) // 分割字符串,无视空格
    l, r := 0, len(t) - 1
    for l < r {
        t[l], t[r] = t[r], t[l] // 交换位置
        l++
        r--
    }
    return strings.Join(t," ") // 添加
}

代码2:

遍历

func reverseWords(s string) string {
    res := "" // 存储答案
    s = " " + s + " " // 前后都加空格统一处理
    lens := len(s)
    l, r := lens -2, lens - 1
    for l >= 0 {
        if s[l+1] == ' ' && s[l] != ' ' { // 确定单词尾部
            r = l + 1
        }
        if s[l+1] != ' ' && s[l] == ' ' { // 确定单词头部并添加
            res += s[l+1:r] + " " // 全都带" "
        }
        l--
    }
    return res[:len(res)-1] // 最后多了一个" "
}

参考:

代码随想录

题目:剑指 Offer 58 - II. 左旋转字符串

思路:

以输入: s = "abcdefg", k = 2为例:

方法一:两个s拼接起来,然后返回中间部分

“abcdefg” + “abcdefg” = “abcdefgabcdefg” 然后再取"ab【cdefgab】cdefg"

方法二:直接分成两部分,然后拼起来:

"【ab】【cdefg】" -> "【cdefg】【ab】"

代码:

func reverseLeftWords(s string, n int) string {
    lens := len(s)
    s = s + s
    return s[n:n+lens] 
    // return s[n:] + s[:n]  直接返回这个
}

参考:

代码随想录

总结

  1. 薄弱点strings库了解不深,之后需要补一下
  2. 之后再用reverse重新做一下下面的几个题
posted @   WtcSky  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示