我在解决这个问题时遇到了麻烦,如果数字
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
。
逻辑是这样的:
(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
非常好的解决方案,伙计!也许是一个小建议。您的解决方案迭代所有 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)
下面的代码有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
};
谢谢,