小于输入的整数数量几乎是回文(如果你只改变一个索引)PYTHON

时间:2017-10-15 10:25:44

标签: python palindrome

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)。一位数字被排除在外,因为它们已经是回文。谢谢!

2 个答案:

答案 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