白痴leetocde出这三小题目
564. Find the Closest Palindrome
给你一个字串化的整数s
请回传与s差距最小的回文(不包含s)
如果有两个差距一样的,请回传比较小的那个
思路:
题目要回文所以将s分成左右两边
且要差距最小,变动左半边的影响会比右半边大
所以以左半边当作基础去创造回文
这是最容易想到的一个可能
还有4种可能
(1)
将s的长度减1并且全部填9
ex s=100,最接近会是99
(2)
将s的长度加1并且头尾填1
ex s=99,最接近会是101
(3)
如果s是奇数将s中间的数+1
如果s是偶数将s中间的两个数+1
ex s=88088,最接近会是88188
(4)
如果s是奇数将s中间的数-1
如果s是偶数将s中间的两个数-1
ex s=8888,最接近会是8778
把五种可能都算出来
就可以得到答案了
golang code :
func nearestPalindromic(s string) string {
n := len(s)
if n == 1 {
return string(s[0] - 1)
}
lefthalf, _ := strconv.Atoi(s[:(n+1)/2])
num, _ := strconv.Atoi(s)
candidates := make([]int, 5)
candidates[0] = createPalindromic(lefthalf+1, n%2 == 0)
candidates[1] = createPalindromic(lefthalf, n%2 == 0)
candidates[2] = createPalindromic(lefthalf-1, n%2 == 0)
candidates[3] = int(math.Pow10(n)) + 1
candidates[4] = int(math.Pow10(n-1)) - 1
result := 0
for _, val := range candidates {
if val != num {
if abs(result-num) > abs(val-num) {
result = val
} else if abs(result-num) == abs(val-num) && result > val {
result = val
}
}
}
return strconv.Itoa(result)
}
func createPalindromic(lefthalf int, iseven bool) int {
palindromic := lefthalf
if !iseven {
palindromic /= 10
}
for lefthalf > 0 {
palindromic = palindromic*10 + lefthalf%10
lefthalf /= 10
}
return palindromic
}
func abs(i int) int {
if i < 0 {
return -i
}
return i
}