Go语言 如何打印数字的每一位都不同于它前面的数字?

nuypyhwy  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(99)

例如,如果我有一个数字35565,输出是3565。
我的代码片段只有一位数,但我不知道如何保留前一位数,以便与下一位数进行核对。

for {
num = num / 10
fmt.Print(num)
        
if num/10 == 0 {
    break
}
}
0x6upsns

0x6upsns1#

这种方法从右到左将一个数字分解为几位数,将它们存储为一个int切片,然后从左到右迭代这些数字,以构建具有“顺序唯一”数字的数字。
我最初试图从左到右分解数字,但无法弄清楚如何处理占位零;从右到左分解,我知道如何捕捉这些零。

// unique removes sequences of repeated digits from non-negative x,
// returning only "sequentially unique" digits:
// 12→12, 122→12, 1001→101, 35565→3565.
//
// Negative x yields -1.
func unique(x int) int {
    switch {
    case x < 0:
        return -1
    case x <= 10:
        return x
    }

    // -- Split x into its digits
    var (
        mag     int   // the magnitude of x
        nDigits int   // the number of digits in x
        digits  []int // the digits of x
    )

    mag = int(math.Floor(math.Log10(float64(x))))
    nDigits = mag + 1

    // work from right-to-left to preserve place-holding zeroes
    digits = make([]int, nDigits)
    for i := nDigits - 1; i >= 0; i-- {
        digits[i] = x % 10
        x /= 10
    }

    // -- Build new, "sequentially unique", x from left-to-right
    var prevDigit, newX int

    for _, digit := range digits {
        if digit != prevDigit {
            newX = newX*10 + digit
        }
        prevDigit = digit
    }

    return newX
}

这是一个Go Playground with a test
这可以通过在开头翻转负号并在结尾恢复它来处理负数。

相关问题