卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章64334本站已运行4115

如何打印与前面的数字不同的数字?

如何打印与前面的数字不同的数字?

问题内容

例如,如果我有数字 35565,则输出为 3565。

所以,我的代码片段得到了个位数,但我不知道如何保留前一个数字以与下一个数字进行检查。

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


正确答案


这种方法从右到左将数字分解为数字,将它们存储为整数切片,然后从左到右迭代这些数字以构建具有“连续唯一”数字的数字。

我最初尝试从左到右分解数字,但不知道如何处理占位零;从右到左分解它,我知道如何捕获这些零。

// 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 进行测试。

可以通过翻转开头的负号并在末尾恢复它来适应处理负数。

卓越飞翔博客
上一篇: Python 循环不适用于 readlines()
下一篇: 无法释放内存字节缓冲区
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏