|
@@ -0,0 +1,47 @@
|
|
|
|
+func nearestPalindromic(n string) string {
|
|
|
|
+ set := make([]int, 0, 5)
|
|
|
|
+ l := len(n)
|
|
|
|
+ set = append(set, int(math.Pow10(l))+1)
|
|
|
|
+ set = append(set, int(math.Pow10(l-1))-1)
|
|
|
|
+ r1, r2, r3 := []rune(n), []rune(n), []rune(n)
|
|
|
|
+ beg, end := l/2-1+l&1, l/2
|
|
|
|
+ if r1[beg] != '0' {
|
|
|
|
+ r1[beg]--
|
|
|
|
+ }
|
|
|
|
+ if r3[beg] != '9' {
|
|
|
|
+ r3[beg]++
|
|
|
|
+ }
|
|
|
|
+ for ; end < l; beg, end = beg-1, end+1 {
|
|
|
|
+ r1[end] = r1[beg]
|
|
|
|
+ r2[end] = r2[beg]
|
|
|
|
+ r3[end] = r3[beg]
|
|
|
|
+ }
|
|
|
|
+ n1, _ := strconv.Atoi(string(r1))
|
|
|
|
+ n2, _ := strconv.Atoi(string(r2))
|
|
|
|
+ n3, _ := strconv.Atoi(string(r3))
|
|
|
|
+ set = append(set, n1)
|
|
|
|
+ set = append(set, n2)
|
|
|
|
+ set = append(set, n3)
|
|
|
|
+ num, _ := strconv.Atoi(n)
|
|
|
|
+ min, res := math.MaxInt32, math.MaxInt32
|
|
|
|
+ for _, i := range set {
|
|
|
|
+ if det := abs(num - i); det != 0 && det < min || (det == min && i < res) {
|
|
|
|
+ min, res = det, i
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return strconv.Itoa(res)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func minInt(x, y int) int {
|
|
|
|
+ if x < y {
|
|
|
|
+ return x
|
|
|
|
+ }
|
|
|
|
+ return y
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func abs(x int) int {
|
|
|
|
+ if x < 0 {
|
|
|
|
+ return -x
|
|
|
|
+ }
|
|
|
|
+ return x
|
|
|
|
+}
|