564.find-the-closest-palindrome.go 948 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. func nearestPalindromic(n string) string {
  2. set := make([]int, 0, 5)
  3. l := len(n)
  4. set = append(set, int(math.Pow10(l))+1)
  5. set = append(set, int(math.Pow10(l-1))-1)
  6. r1, r2, r3 := []rune(n), []rune(n), []rune(n)
  7. beg, end := l/2-1+l&1, l/2
  8. if r1[beg] != '0' {
  9. r1[beg]--
  10. }
  11. if r3[beg] != '9' {
  12. r3[beg]++
  13. }
  14. for ; end < l; beg, end = beg-1, end+1 {
  15. r1[end] = r1[beg]
  16. r2[end] = r2[beg]
  17. r3[end] = r3[beg]
  18. }
  19. n1, _ := strconv.Atoi(string(r1))
  20. n2, _ := strconv.Atoi(string(r2))
  21. n3, _ := strconv.Atoi(string(r3))
  22. set = append(set, n1)
  23. set = append(set, n2)
  24. set = append(set, n3)
  25. num, _ := strconv.Atoi(n)
  26. min, res := math.MaxInt32, math.MaxInt32
  27. for _, i := range set {
  28. if det := abs(num - i); det != 0 && det < min || (det == min && i < res) {
  29. min, res = det, i
  30. }
  31. }
  32. return strconv.Itoa(res)
  33. }
  34. func minInt(x, y int) int {
  35. if x < y {
  36. return x
  37. }
  38. return y
  39. }
  40. func abs(x int) int {
  41. if x < 0 {
  42. return -x
  43. }
  44. return x
  45. }