【问题标题】:How to add zeros to 2d slice string elements如何将零添加到二维切片字符串元素
【发布时间】:2022-11-28 00:08:38
【问题描述】:

任务是将零添加到 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]]
 
}

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

【问题讨论】:

    标签: string algorithm go slice


    【解决方案1】:

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

    范围也从索引 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 上试试。

    【讨论】:

    • 谢谢,现在我完全理解了这个任务
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2016-03-21
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多