算法原链接

https://leetcode-cn.com/problems/palindrome-number/

解法

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. "strconv"
  6. )
  7. func main() {
  8. x := 121
  9. r := isPalindrome1(x)
  10. fmt.Println(r)
  11. }
  12. // 字符串解法
  13. func isPalindrome(x int) bool {
  14. if x < 0 {
  15. return false
  16. }
  17. if x < 10 {
  18. return true
  19. }
  20. s := strconv.Itoa(x)
  21. l := len(s)
  22. var left, right int
  23. if l%2 == 0 {
  24. left = l/2 - 1
  25. right = l / 2
  26. } else {
  27. middle := float64(l) / float64(2)
  28. left = int(middle) - 1
  29. right = int(math.Ceil(middle))
  30. }
  31. left, right = test(s, left, right)
  32. return left == 0 && right == len(s)-1
  33. }
  34. func test(s string, left, right int) (int, int) {
  35. for ; left >= 0 && right < len(s) && s[left] == s[right]; left, right = left-1, right+1 {
  36. }
  37. return left + 1, right - 1
  38. }
  39. // 官方解法
  40. func isPalindrome1(x int) bool {
  41. if x < 0 || (x != 0 && x%10 == 0) {
  42. return false
  43. }
  44. revertedNumber := 0
  45. for revertedNumber < x {
  46. revertedNumber = revertedNumber*10 + x%10
  47. x /= 10
  48. }
  49. return x == revertedNumber || x == revertedNumber/10
  50. }