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

任务是将零添加到 2d 切片的字符串元素。所以标准输入是 [["7" "3" "1"]["2" "9"]] 我需要将每个切片的最后一个元素的零添加到第一个元素。对于每一步,零计数器都会增加 +1。因此,标准输出应为 [["700", "30", "1"]["20", "9"]]。


我试过做这样的算法,但得不到预期的答案。这是我的代码:


package main


import (

    "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]]

 

}

如何更改我的代码以获得预期的答案?


一只甜甜圈
浏览 89回答 1
1回答

不负相思意

计数零必须在每一行中重置,因此将该代码移到第一个循环中。范围也从 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 herefunc 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上尝试。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go