n=int(input())
def palindrome(x):
m=str(x)
l=len(m)
if l==1 or l==2 or l==3:
return True
if l>3:
for i in m:
for j in range (0,10):
k=m.replace(str(i),str(j))
if k==k[::-1]:
return True
else:
return False
def almost(n):
count=0
for x in range (10,n):
if str(x)!=str(x)[::-1] and palindrome(x):
count+=1
return count
print (almost(n))
到目前为止,这是我的代码。它不适用于输入超过3位的所有情况。例如,它不允许我在终端输入超过5位的数字。它只是换了一个新行,所以我必须打开一个新标签。我试图输入1000000并且它没有产生输出。它应该给我43011。代码必须给出一些不是回文的整数,但是如果你只改变一个数字就像14351,如果你改变4到5它就是回文。因此,输入可能是23,输出将是11(因为如果你改变一位数,那么小于23的数字就是回文数据是10,12,13,14,15,16,17,18,19,20 ,21)。一位数字被排除在外,因为它们已经是回文。谢谢!
答案 0 :(得分:0)
检查您是否已经看到左侧和右侧之间的位置不同,而不是替换数字并测试它是否为回文。如果多个数字不同,只需更改一位数即可使其成为回文数。
由于我们将左侧与右侧进行比较,我们只需要迭代一半的字符串(到l/2
)。由于我们在这里处理整数,如果有一个奇数位数,我们最终会在中间数字之前停止。
def palindrome(x):
m = str(x)
l = len(m)
if m == m[::-1]:
return False
if l < 4:
return True
already_wrong = False
for i in range(0, l/2):
# -1 since the index is 0 based and l is one larger than the last index
if m[i] != m[l-i-1]:
# more than one digit differs? (i.e. we've already been here?)
if already_wrong:
return False
already_wrong = True
return True
print(palindrome(14456))
print(palindrome(15556))
print(palindrome(14351))
print(palindrome(166666))
print(palindrome(131666))
输出
False
True
True
True
False
答案 1 :(得分:0)
如果字符串和字符串之间只有2位数字不相反,你只需要解决 - 然后你可以交换一个数字来制作回文...这也排除了单个数字和回文本身(因为0位数会有所不同),例如:
def is_almost_palindrome(n):
s = str(n)
if sum(a != b for a, b in zip(s, reversed(s))) == 2:
return True
return False
然后你的计数为:
almost_palindromes = sum(is_almost_palindrome(n) for n in range(1000000))
# 43011