检查数字是否为回文,而不将其转换为字符串

问题描述 投票:0回答:4

我在解决这个问题时遇到了麻烦,如果数字

n
是回文,则简单地返回True或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()
时,都应将
5
3
2
添加到值
y

python iteration palindrome
4个回答
13
投票

逻辑是这样的:

(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 = 235
y = 0

第一次迭代:

x = 23
y = 5

第二次迭代:

x = 2
y = 53

第三次迭代:

x = 0
y = 532


3
投票

非常好的解决方案,伙计!也许是一个小建议。您的解决方案迭代所有 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)


0
投票

下面的代码有11510个leetcode测试用例并且被接受 检查数字是否是回文而不将其转换为字符串

var isPalindrome = function(x) {
let list=[]
if(x<0){
    return false
}
while(x>0){
    if(x<10){
        list.push(parseInt(x))
        break;
    }
    let num=parseInt( x%10)
    list.push(num)
    x=parseInt( x/10)
}  
for(var i=0;i<list.length/2;i++){
    if(list[i]!=list[list.length-(i+1)]){
        return false
    }
}
return true

};

谢谢,


0
投票

参见@Taku的回答。但如果您想了解它是如何工作的,请参阅下面的流程图

© www.soinside.com 2019 - 2024. All rights reserved.