在Golang中,如何将整数数组中的数字连接成一个数字?

4

我有一个整数数组:

nums := []int{1, 2, 3}

我该如何将它转换成整数123呢?
5个回答

6

我欣赏 @KelvinS 的方法,虽然已经存在一个 math.Pow 函数(尽管它只适用于 float64 类型)。不过,他的方法解决了你真正想要实现的目标,即将每个连续数字(从右往左)提高一个数量级,并将它们相加。因此,在我看来,最简单直接的方法是:

func sliceToInt(s []int) int {
    res := 0
    op := 1
    for i := len(s) - 1; i >= 0; i-- {
        res += s[i] * op
        op *= 10
    }
    return res
}

func main() {
    nums := []int{1, 2, 3}
    fmt.Println(sliceToInt(nums))
}

sliceToInt 命名不佳,但你应该可以理解其含义。

https://play.golang.org/p/JS96Nq_so-

尽管这可能只是微小的优化,但如果它恰好在热路径中出现,那么优化速度可能是值得的。

BenchmarkPow-8              100000000           13.5 ns/op         0 B/op          0 allocs/op
BenchmarkJoin-8              5000000           272 ns/op           8 B/op          5 allocs/op
BenchmarkBuffer-8            2000000           782 ns/op         160 B/op          8 allocs/op
BenchmarkSliceToInt-8       200000000            8.65 ns/op        0 B/op          0 allocs/op
PASS

1
我认为@sberry的回答最好。我会倾向于进一步简化并使用 for _, x in sres = 10*res + x - aMike
1
nums := []int{1, 20, 3}会发生什么? :) - Martin Gallagher
不错的观点,@MartinGallagher!可以说20不是数字。这取决于真正的需求是什么。连接一堆任意数字,还是将一系列数字重新组合成一个数字?我们不知道;没有具体说明。 - aMike
如果切片包含大量项目,则会超出范围,导致错误的值。但对于这种用例,它是有效的。我最终在我的用例中使用了big.NewInt - Ari

4
试试这样做:
package main

import (
    "strconv"
    "log"
)

func join(nums []int) (int, error) {
    var str string
    for i := range nums {
        str += strconv.Itoa(nums[i])
    }
    num, err := strconv.Atoi(str)
    if err != nil {
        return 0, err
    } else {
        return num, nil
    }
}

func main() {
    nums := []int{1, 2, 3}
    num, err := join(nums)
    if err != nil {
        log.Println(err)
    } else {
        log.Println(num)
    }
}

也许有更好的方法来解决这个问题,但这个例子是可行的。

2

您还可以遍历切片并使用算术运算构建整数

package main

import (
    "fmt"
)

func Pow(a, b int) int {
    result := 1
    for i := 0; i < b; i++ {
        result *= a
    }
    return result
}

func main() {
    nums := []int{1, 2, 3}
    num := 0
    length := len(nums)
    for i, d := range nums {
        num += d * Pow(10, length-i-1)
    }
    fmt.Println(num)
}

0

遍历您的切片并将每个项添加到缓冲区:

var buf bytes.Buffer
nums := []int{1, 2, 3}
for i := range nums {
    buf.WriteString(fmt.Sprintf("%d", nums[i]))
}

你可以使用strconv包将其转换为整数。
i, err := strconv.Atoi(buf.String())

这里是GoPlay:
https://play.golang.org/p/8w-gc2S2xR


1
我认为他们想要获取一个整数,而不是一个字符串。 - Adam Smith
好的,谢谢指出。已更新以反映这一点。 - william.taylor.09

0
对我来说,最简单的方法是:
1)将int切片转换为string切片
2)连接字符串
3)将结果字符串转换为int
package main

import (
    "fmt"
    "strconv"
    "strings"
)

func sliceToInt(ints []int) int {
    stringVals := make([]string, len(ints))

    for ind, val := range ints {
        stringVals[ind] = strconv.Itoa(val)
    }

    newInt, _ := strconv.Atoi(strings.Join(stringVals, ""))

    return newInt

}

func main() {
    s1 := []int{1, 2, 3}
    fmt.Println(sliceToInt(s1))

    s2 := []int{1, 20, 3}
    fmt.Println(sliceToInt(s2))
}

结果:

123
1203

将 int 切片转换为字符串,然后连接起来的时间复杂度是 O(N),而逐步构建最终字符串的时间复杂度是 O(N * N)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接