小于输入的接近回文的整数数量(如果你只改变一个索引)PYTHON
number of integers less than the input that are nearly palindromes (if you just change one index) PYTHON
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,但没有产生输出。它应该给了我 43,011。该代码必须给出一些不是回文的整数,但是如果您只更改一个数字,例如 14351,则如果您将 4 更改为 5,它将是一个回文。所以输入可能类似于 23,输出可能是 11(因为如果你改变一位数,小于 23 的数字将是回文数是 10,12,13,14,15,16,17,18,19,20 ,21).一位数被排除在外,因为它们已经是回文。谢谢!
与其替换数字并测试它是否是回文,不如检查您是否已经看到左侧和右侧不同的位置。如果不止一个数字不同,你不能只改变一个数字就把它变成回文。
因为我们比较的是左边和右边,所以我们只需要迭代一半的字符串(到 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
你只需要算出字符串和反向字符串之间是否只有 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
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,但没有产生输出。它应该给了我 43,011。该代码必须给出一些不是回文的整数,但是如果您只更改一个数字,例如 14351,则如果您将 4 更改为 5,它将是一个回文。所以输入可能类似于 23,输出可能是 11(因为如果你改变一位数,小于 23 的数字将是回文数是 10,12,13,14,15,16,17,18,19,20 ,21).一位数被排除在外,因为它们已经是回文。谢谢!
与其替换数字并测试它是否是回文,不如检查您是否已经看到左侧和右侧不同的位置。如果不止一个数字不同,你不能只改变一个数字就把它变成回文。
因为我们比较的是左边和右边,所以我们只需要迭代一半的字符串(到 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
你只需要算出字符串和反向字符串之间是否只有 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