Как добавить нули к элементам строки 2d-среза

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

Как изменить мой код, чтобы получить ожидаемый ответ?

В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

Другие вопросы по теме