概述
例如,以下数字是复数
1
121
12321
9
0
下面的数字不是
-121
1211
我们有两种方法可以找出一个数字是否是复数
-
把数字倒过来。如果反转后的数字等于原来的数字,那么这个数字就是回文。
-
另一种方法是使用递归,并传入数字的指针。在向下移动递归树时,将该数字除以10。当向上移动递归树时,将数字指针上的值除以10。在递归树的任何一步中,当它们相遇时,原始数字的最后一位将是第一位,而指针上的数字的最后一位将是第一位。我们可以比较这两个数字来检查它们是否相等。这种检查是在它们每次相遇时进行的。
第一种解决方案--倒转数字
下面是同样的程序
package main
import (
"fmt"
"math"
)
func main() {
output := isPalindrome(121)
fmt.Println(output)
output = isPalindrome(12)
fmt.Println(output)
output = isPalindrome(1234)
fmt.Println(output)
output = isPalindrome(12321)
fmt.Println(output)
output = isPalindrome(-101)
fmt.Println(output)
}
func isPalindrome(x int) bool {
if x < 0 {
return false
}
if x < 10 {
return true
}
xReversed := reverse(x)
return xReversed == x
}
func reverse(x int) int {
sign := "positive"
if x >= 0 {
sign = "positive"
} else {
sign = "negative"
}
x = int(math.Abs(float64(x)))
var reversedDigit int
for x > 0 {
lastDigit := x % 10
reversedDigit = reversedDigit*10 + lastDigit
x = x / 10
}
if sign == "negative" {
reversedDigit = reversedDigit * -1
}
return reversedDigit
}
输出
true
false
false
true
false
第二种解决方案--使用递归法
以下是相同的程序
package main
import "fmt"
func main() {
a := 121
output := isPalindrome(a, &a)
fmt.Println(output)
a = 12
output = isPalindrome(a, &a)
fmt.Println(output)
a = 1234
output = isPalindrome(a, &a)
fmt.Println(output)
a = 12321
output = isPalindrome(a, &a)
fmt.Println(output)
a = -121
output = isPalindrome(-a, &a)
fmt.Println(output)
}
func isPalindrome(x int, dup *int) bool {
if x < 0 {
return false
}
if x < 10 {
return true
}
palin := isPalindrome(x/10, dup)
*dup = *dup / 10
lastDigit := x % 10
if palin && *dup%10 == lastDigit {
return true
}
return false
}
输出
true
false
false
true
false