python回文联多种解决方案

  • A+
所属分类:Python习题

大部分代码来源于小甲鱼社区,如需要提问,请搜索小甲鱼社区,或在下文中访问相关链接。

所谓回文联

天连碧水碧连天

洞帘水挂水帘洞

山果花开花果山

脸映桃红桃映脸

海上飞燕飞上海

江内行船行内江

河边赛车赛边河

列表倒叙判断

代码分析,从上面的一些回文联中发现了一些现象,第一个字与最后一个字相同,第二个字与最后第二个字相同,这种思路下答案会是:

  1. def judge():
  2.     n = input('please enter a string :')
  3.     if n == n[::-1]:
  4.         for i in n[::-1]:
  5.             print(i)
  6.         print('yes')
  7.     else:
  8.         print('no')
  9. judge()

原文链接:

其实一开始有一个问题,把我难住了,就是n == n[::-1]在我的理解里面它只会判断第一个与最后一个,但是后面使用for循环将其一个一个打印出来后,才发现它判断了每一个字符,在此感谢群里(528770819)茶晓的点拨。

使用list和翻转的功能进行对比:

  1. def fun(hwl):
  2.     list1=list(hwl)
  3.     list2=reversed(list1) #后期更新如果您测试了这个不妨list2=list(reversed(list1))
  4.     print(list1,list(list2))
  5.     if list1==list(list2):
  6.         return 'yes'
  7.     else:
  8.         return 'no'
  9. print (fun(input('请输入您要判读的回文联:')))

请注意这是错误的,原文链接:http://bbs.fishc.com/thread-84863-1-1.html,

Python3 官方文档这样介绍 reverse()方法语法:list.reverse() 该方法没有返回值,但是会对列表的元素进行反向排序。

你第四行代码 list2 = list1.resverse() 中 list2 没有得到值,自然和有值的list1不对等,所以最后结果得到的是NO 。

但是还没完,这个标签还是可以用,只是用的方法超过了19课的课程,就当作提前预习了。

  1. def fun1(str1):
  2.     str2 = ''.join(reversed(str1))
  3.     print(str1,list(str1))
  4.     print(str2,list(str2))
  5.     if str2 == str1:
  6.         return 'yes'
  7.     else:
  8.         return 'no'
  9. print(fun1(input('输入要判断的回文联:')))

join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串,''.join(reversed(str1))  ,用空区分,就是啥玩意也没有,反转str1的内容,进行内容的判断。

缩写(三元操作符):

  1. def fun1(str1):
  2.     return 'yes' if str1 == ''.join(reversed(str1)) else 'no'

 

通过数字的叠加来判断回文链接

  1. def huiwenlian(string):
  2.     length=len(string)
  3.     count=length//2
  4.     flag=0
  5.     for i in range(count):
  6.         if string[i]==string[length-1-i]:
  7.             flag += 1
  8.             print(string[i],string[length-1-i],flag)   #后加的一行,因为一直没看懂
  9.     if  flag== count:
  10.         print('是回文联')
  11.     else:
  12.         print('不是回文联')
  13. stringset=input('请输入:')
  14. huiwenlian(stringset)

原文链接:http://bbs.fishc.com/thread-67989-1-1.html

其实一开始没看懂,计算长度,怎么去对比,后来去打印string[i]==string[length-1-i],才明白过来,这里还有个绕脑筋的,就是python是从零开始记位,而后面是从-1开始的,所以就是后面多了一个-1这个运算。

  1. 请输入:天连碧水水碧连天
  2. 8 4
  3. 天 天 1
  4. 连 连 2
  5. 碧 碧 3
  6. 水 水 4
  7. 是回文联

通过递归判断

  1. def is_palindrome(n, start, end):
  2.         if start > end:
  3.             return 1
  4.         else:
  5.             return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0
  6. string = input('请输入一串字符串:')
  7. length = len(string)-1
  8. if is_palindrome(string, 0, length):
  9.         print('\"%s\"是回文字符串!' % string)
  10. else:
  11.         print('\"%s\"不是回文字符串!' % string)

逻辑与上面的相差不多,注意辨别string,与start,被这个给混淆了。

原文链接:http://bbs.fishc.com/thread-69131-1-1.html

李金龙

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: