两个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
}