leetcode 9. 回文数

131 阅读1分钟

力扣题目链接
牛客题目链接

两个OJ对该题目的描述略有不同,请注意区分。

我的思路:反转输入的整数,在反转的过程中

  • 判断越界
  • 判断对应数位上的数字是否相等 如果出现越界或者数字不相等的情况,算法结束。

下面给出在两个OJ都AC的解答。

func isPalindrome(x int) bool {
    if x < 0 {
        return false
    }
    if x == 0 {
        return true
    }

    v := x
    var c int // x的十进制数位个数
    for v > 0 {
        c++
        v /= 10
    }

    const (
        maxP = math.MaxInt32/10
        maxR = math.MaxInt32%10
    )
    v = x
    var rev int
    for v > 0 {
        if rev > maxP {
            // 再乘以10就越界了
            return false
        }
        rev *= 10
        r := v%10
        if (rev == maxP && r > maxR) ||
           (rev > maxP && r == maxR) {
            // 再加r就越界了
            return false
        }
        rev += r
        c--
        if c < 0 {
            return false
        }
        if rev != x/getPowerOfTen(c) {
            // 前后对应数位上的数字不等
            return false
        }
        v /= 10
    }
    return true
}

// 根据int32的取值范围,此处c的取值范围是[0,9]。
func getPowerOfTen(c int) int {
    // 类似查表法,不需要做计算了。
    switch c {
    case 0:
        return 1
    case 1:
        return 10
    case 2:
        return 100
    case 3:
        return 1000
    case 4:
        return 1_0000
    case 5:
        return 10_0000
    case 6:
        return 100_0000
    case 7:
        return 1000_0000
    case 8:
        return 1_0000_0000
    case 9:
        return 10_0000_0000
    }
    return 1
}