Задача состоит в том, чтобы добавить нули к строковым элементам 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]]
}
Как изменить мой код, чтобы получить ожидаемый ответ?


Подсчет нулей должен сбрасываться в каждой строке, поэтому переместите этот код внутрь первого цикла.
Также диапазон идет от индекса 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.