2 tony540102689 Tony540102689 于 2016.03.05 12:46 提问

回数是指从左向右读和从右向左读都是一样的数,例如12321。请利用filter()滤掉非回数 20C

def is_palindrome(n):
s = str(n)
for i in range(len(s)):
if s[i] == s[len(s)-1-i]:
return True
else:
return False

output = filter(is_palindrome, range(1, 1000))
print(list(output))

谁来解释一下原理啊,特别是

for i in range(len(s)):
if s[i] == s[len(s)-1-i]

3个回答

WinsenJiansbomber
WinsenJiansbomber   2016.03.05 13:54

这是什么语言?Python? Ruby?

代码中的for走得太远了,只要到len(s)/2就可以了。

可以利用双向堆栈的数据结构思想来处理啊,先拿到数据,然后实现两个指针指向头尾,做比较时,头尾的字符相比较,相同则两指针各向内收敛一个字节,以此重复进行判断

caozhy
caozhy   Ds   Rxr 2016.03.05 16:22

for i in range(len(s)):
if s[i] == s[len(s)-1-i]
这个代码的原理就是将数字转换为字符串s依次比较第0位和最后一位(长度-1),第一位(i=1)和倒数第二位(长度-1-1),等等。
比较到len(s)/2,也就是一半为止。判断是否对称。

bealing
bealing   Rxr 2016.03.05 13:41

过滤前的数最多是3位,所以实际上只判断第一位和最后一位数字是否相同,就可以判断是否是回文数,而循环只执行了1次就return了
当数字是1位数时,判端s[0] == s[1-1-0]
当数字是2位数时,判端s[0] == s[2-1-0]
当数字是3位数时,判端s[0] == s[3-1-0]

这个函数的写法太实用,如果数字是4位数甚至更多位,就会出错,下面的函数是我写的,仅供参考:

def is_palindrome(n):
s = str(n)
for i in range(len(s)/2):
if s[i] != s[len(s)-1-i]:
return False
return True

bealing
bealing ^~^打错了,我的意思是 ,你给的那个函数的适用范围的局限性很大
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!