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

Check if a number is a palindrome without changing it into string

我遇到了这个问题,如果数字 n 是回文,那么 return True of False。

注:我这里有一个____表示哪里有空格需要填写,有2个空格space。

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

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

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

逻辑如下:(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

出色的解决方案,伙计!也许一个小建议。您的解决方案迭代所有 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
Space 复杂度:O(1)