// 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
}
1条答案
按热度按时间0x6upsns1#
这种方法从右到左将一个数字分解为几位数,将它们存储为一个int切片,然后从左到右迭代这些数字,以构建具有“顺序唯一”数字的数字。
我最初试图从左到右分解数字,但无法弄清楚如何处理占位零;从右到左分解,我知道如何捕捉这些零。
这是一个Go Playground with a test。
这可以通过在开头翻转负号并在结尾恢复它来处理负数。