为了账号安全,请及时绑定邮箱和手机立即绑定

如何将零添加到二维切片字符串元素

如何将零添加到二维切片字符串元素

Go
一只甜甜圈 2023-03-21 10:33:13
任务是将零添加到 2d 切片的字符串元素。所以标准输入是 [["7" "3" "1"]["2" "9"]] 我需要将每个切片的最后一个元素的零添加到第一个元素。对于每一步,零计数器都会增加 +1。因此,标准输出应为 [["700", "30", "1"]["20", "9"]]。我试过做这样的算法,但得不到预期的答案。这是我的代码:package mainimport (    "fmt"    "strings")func addZero(strs [][]string) [][]string {    zero := "0"    counter := 0    for i := range strs {        for j := range strs[i] {            strs[i][j] += strings.Repeat(zero, counter)        }        counter++    }    return strs}func main() {    fmt.Println(addZero([][]string{{"7", "3", "1"}, {"2", "9"}}))// here the result is [[7 3 1] [20 90]] }如何更改我的代码以获得预期的答案?
查看完整描述

1 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

计数零必须在每一行中重置,因此将该代码移到第一个循环中。


范围也从 index 开始0,并且您希望从行尾增加零,因此counter必须从 开始len(strs[i])-1,并且您必须递减它:


func addZero(strs [][]string) [][]string {

    for i := range strs {

        zero := "0"

        counter := len(strs[i]) - 1

        for j := range strs[i] {

            strs[i][j] += strings.Repeat(zero, counter)

            counter--

        }

    }

    return strs

}

通过这些更改,输出将是(在Go Playground上尝试):


[[700 30 1] [20 9]]

请注意,如果您要从末尾开始处理行,则追加的后缀(零)会增加。所以你可以strings.Repeat()通过保留和“扩展”前面的后缀来放弃:


func addZero(strs [][]string) [][]string {

    for _, line := range strs {

        zeros := ""

        for i := len(line) - 1; i >= 0; i-- {

            line[i] += zeros

            zeros += "0"

        }

    }

    return strs

}

这输出相同。在Go Playground上尝试一下。


另请注意,字符串可以被切片,结果与切片字符串共享内存。所以它很快而且不会产生垃圾!您可以构建一个仅zeros包含零的长字符串,并且可以将这个长字符串切片以包含您需要追加的任意多个零。此解决方案避免了任何不必要的字符串分配和连接:


var zeros = strings.Repeat("0", 1000) // Use the maximum length here


func addZero(strs [][]string) [][]string {

    for _, line := range strs {

        count := len(line) - 1

        for i := range line {

            line[i] += zeros[:count-i]

        }

    }

    return strs

}

这再次输出相同的结果,请在Go Playground上尝试。



查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信