检查数字是否为回文而不将其更改为字符串

时间:2018-06-02 19:50:38

标签: python iteration palindrome

我遇到了这个问题的麻烦,如果数字n是回文,则只返回True of False。

注意:无论我在哪里____表示需要填写空白的地方。有2个空格。

def is_palindrome(n):
    x, y = n, 0
    f = lambda: ____
    while x > 0:
        x, y = ____ , f()
    return y == n

我花了大约一个小时的时间。我发现将x//10放在第二个空格中将允许函数迭代n中的位数。然后归结为函数f

理想情况下,每次调用时,都应将n中的最后一位数字添加到新号码y。因此,如果n = 235,while循环将迭代3次,并且每次调用f()时,都应添加532,值y

2 个答案:

答案 0 :(得分:4)

这是逻辑:(y * 10) + x % 10

def is_palindrome(n):
    x, y = n, 0
    f = lambda: (y * 10) + x % 10
    while x > 0:
        x, y = x//10 , f()
    return y == n

print(is_palindrome(123454321))
# True
print(is_palindrome(12))
# False

y*10将当前y向左移动1位,x%10添加最后一位数。

print(is_palindrome(235))
# False

预迭代:x = 235y = 0

第一次迭代:x = 23y = 5

第二次迭代:x = 2y = 53

第三次迭代:x = 0y = 532

答案 1 :(得分:0)

出色的解决方案,伙伴!也许一个小建议。您的解决方案将对所有n位数字进行迭代,但是您只需要对n / 2位数字进行迭代即可。而且,您可以直接处理负值,因为它们不是回文。

def is_palindrome(x):
    if x < 0 or (x % 10 == 0 and x != 0):
        return False
    head, tail = x, 0
    while head > tail:
        head, tail = head // 10, tail * 10 + head % 10
    # When the length is an odd number, we can get rid of the middle digit by tail // 10
    return head == tail or head == tail // 10

时间复杂度: O(log(n)),因为我们在每次迭代中都除以10
空间复杂度: O(1)