输入一个正整数的字符串,输出与它最接近的对称数字(不包括它自己)的字符串
注1: 输入字符串的长度最多不会超过18
注2: 当大于输入数字和小于输入数字的对称数字与输入数字距离相同时,取小的数字作为答案
找出几个候选答案然后比较差值(最多为4个)
长度为1,#长度为1,直接减一返回
开头为1,9~~9为一个候选答案 例:100001,答案为99999
开头为9,10~~01为一个候选答案 例:99999,答案为100001
如果本身对称,则把最中间的一个(或两个)位数减(如果0则加)一
例:123321,答案为122221
例:120021,答案为121121
如果不对称:
-把前半部分逆序替换掉后半部分 例:1223,答案为1221
while True: try: string = input() length = len(string) if length == 1: # 长度为1,直接减一 print(str(int(string) - 1)) else: candidate = [] # 候选字答案 if string[0] == '1': # 开头为1,9**9可能为候选字 candidate.append('9' * (length - 1)) elif string[0] == '9': # 开头为9,10**01可能为候选字 candidate.append('1' + '0' * (length - 1) + '1') if string == string[::-1]: # 如果本身对称,则把最中间的一个(或两个)位数减(如果0则加)一 temp = list(string) if temp[length // 2] == '0': temp[length // 2] = temp[(length - 1) // 2] = '1' else: char = str(int(temp[length // 2]) - 1) temp[length // 2] = temp[(length - 1) // 2] = char candidate.append(''.join(temp)) else: # 不对称,把前半部分逆序替换掉后半部分 temp = list(string[:(length // 2)] + string[:((length + 1) // 2)][::-1]) candidate.append(''.join(temp)) if temp[length // 2] == '0': # 最中间为0,只能加一 temp[length // 2] = temp[(length - 1) // 2] = '1' candidate.append(''.join(temp)) elif temp[length // 2] == '9': # 最中间为9,只能减一 temp[length // 2] = temp[(length - 1) // 2] = '8' candidate.append(''.join(temp)) else: # 加一和减一都加入候选答案 char = int(temp[length // 2]) temp[length // 2] = temp[(length - 1) // 2] = str(char + 1) candidate.append(''.join(temp)) temp[length // 2] = temp[(length - 1) // 2] = str(char - 1) candidate.append(''.join(temp)) candidate = sorted(list(map(int, candidate))) string = int(string) diff = string # 保存差值 for num in candidate: # 在候选答案里选择差值最小的最小数(前面已排序) if abs(string - num) < diff: result = num diff = abs(string - num) print(result) except Exception: break