Day08 字符串 part01

114 阅读2分钟

概念

  1. golang中的input

可以使用fmt.Scan 或者 fmt.scanf,fmt.scanln 来获取用户的输入

var input string

_, err := fmt.Scan(&input)
if err != nil {
    fmt.Println("输入错误:", err)
    return
}
fmt.Println(“你输入的是:”, input)

在这个例子中,fmt.Scan 函数用于从标准输入中读取值,并将这些值赋给后续的参数。这里的 &input 是 input 变量的指针,使得 fmt.Scan 可以修改这个变量的值。如果输入成功,程序会输出用户输入的内容。如果发生错误,会输出错误信息。

当需要输入多个数据时,可以使用fmt.Scan()函数的多个参数来实现。例如,如果需要输入两个整数,则可以使用如下语法:

var a, b string
fmt.Scan(&a, &b)

刷题

344 反转字符串

leetcode.cn/problems/re…

尽量不去依赖库函数去解决,golang也没有reserve函数去直接实现

image.png

541 反转字符串II

leetcode.cn/problems/re…

image.png

优化:

在一次提交中,我使用了count来计算字符串长度整除2*k的大小,这是没有必要的

其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。

因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。

所以当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。

image.png

卡码网: 替换数字

kamacoder.com/problempage…

image.png

脱离leecode有一些不适应,输入从函数变量变成了input变量,需要完整的写出package,main,遇到了一些问题

package main

import "fmt"

func main() {
    var input string
    fmt.Scan(&input)
    bstr := []byte(input)
    for i:=len(bstr)-1; i>=0 ; i-- {
        if bstr[i] >= '0' && bstr[i] <= '9' {
            // 切片的切割数字超过切片长度也不会溢出
            //fmt.Println(bstr[i+1:])
            bstr = append(bstr[:i], append([]byte("number"), bstr[i+1:]...)...)
        }
    }
    fmt.Println(string(bstr))
}

总结

Golang 报错cannot assign to s[left] (neither addressable nor a map index expression)

这个错误表明你正在尝试修改一个不可addressable的变量。在Golang中,只有某些类型的变量是addressable的,比如指针或者数组的元素。

错误的代码可能看起来像这样:

s := "hello"
s[0] = 'H'

这里的s[0]不是一个可addressable的变量,因为字符串(string 类型)是不可变的。

解决方法:

如果你需要修改字符串,你可以使用字节切片([]byte)或者字符串构建器(strings.Builder)。