小于输入的接近回文的整数数量(如果你只改变一个索引)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