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

最新更新