鱼C论坛

 找回密码
 立即注册
查看: 859|回复: 8

[已解决]想请大神讲一下思路,有点没看懂

[复制链接]
发表于 2019-3-23 15:51:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. def palindrome(string):
  2.     length = len(string)
  3.     last = length-1
  4.     length //= 2
  5.     flag = 1
  6.     for each in range(length):
  7.         if string[each] != string[last]:
  8.             flag = 0
  9.         last -= 1

  10.     if flag == 1:
  11.         return 1
  12.     else:
  13.         return 0

  14. string = input('请输入一句话:')
  15. if palindrome(string) == 1:
  16.     print('是回文联!')
  17. else:
  18.     print('不是回文联!')
复制代码



这串代码不是很懂是通过什么逻辑来执行的,
最佳答案
2019-3-23 16:14:15
本帖最后由 jackz007 于 2019-3-23 16:31 编辑

      在 palindrome(string) 中,先假定 string 是回文联 (flag = 1),然后通过循环(for each in range(length):)枚举 string 中的每一个字符,从索引 0 开始,到字符串长度的一半( length // 2 - 1) 结束,把 string 的第一个字符 (string[each]) 与倒数第 1个字符 (string[last]),第 2 个字符与倒数第 2 个字符...... 逐字符进行比较,在此过程中,只要有 1 对字符不相同,就置 flag = 0 (判定 string 不是回文联)最后,在退出函数的时候,把判定结果通过 return 反馈给调用者。
  1. def palindrome(string):
  2.     length = len(string)                  # 取得字符串的长度
  3.     last = length-1                       # 把字符串尾部的索引指针指向 string 最后那个字符
  4.     length //= 2                          # 字符串长度折半,也就是说,后面的循环只需要索引到字符串长度的一半就可以了
  5.     flag = 1                              # 先假定 string 是回文联
  6.     for each in range(length):            # 循环枚举 string 每个字符
  7.         if string[each] != string[last]:  # 如果 string[each] 与 string[len(string) - 1 - each] 不相同
  8.             flag = 0                      # 判定 string 不是回文联
  9.         last -= 1                         # 否则,尾部字符索引指针减一,准备下一次循环比较

  10.     if flag == 1:                         # 如果是回文联
  11.         return 1                          # 返回 1 (True)
  12.     else:                                 # 否则
  13.         return 0                          # 返回 0 (False)
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-23 16:01:45 | 显示全部楼层
关键在于for循环里的内容,判断字符串第一个字符和倒数第一个字符是否相等,然后判断第二个和倒数第二个字符是否相等,以此类推;通过判断结果来改变flag的值,若每次判断结果都是相等的(回文联),flag就不会重新赋值,始终为1;但凡有一次判断是不等的(非回文联),就赋值为0.
后面的判断你应该就明白了。
不知道我讲清楚了没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-23 16:12:31 | 显示全部楼层
大裤衩子 发表于 2019-3-23 16:01
关键在于for循环里的内容,判断字符串第一个字符和倒数第一个字符是否相等,然后判断第二个和倒数第二个字 ...
  1. length = len(string)
  2.     last = length-1
  3.     length //= 2
  4.     flag = 1
  5.     for each in range(length):
  6.         if string[each] != string[last]:
  7.             flag = 0
  8.         last -= 1

  9.     if flag == 1:
  10.         return 1
  11.     else:
  12.         return 0
复制代码




这一串没有看懂,为什么 last = length -1
length // =2
不懂是什么意义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-23 16:14:15 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-3-23 16:31 编辑

      在 palindrome(string) 中,先假定 string 是回文联 (flag = 1),然后通过循环(for each in range(length):)枚举 string 中的每一个字符,从索引 0 开始,到字符串长度的一半( length // 2 - 1) 结束,把 string 的第一个字符 (string[each]) 与倒数第 1个字符 (string[last]),第 2 个字符与倒数第 2 个字符...... 逐字符进行比较,在此过程中,只要有 1 对字符不相同,就置 flag = 0 (判定 string 不是回文联)最后,在退出函数的时候,把判定结果通过 return 反馈给调用者。
  1. def palindrome(string):
  2.     length = len(string)                  # 取得字符串的长度
  3.     last = length-1                       # 把字符串尾部的索引指针指向 string 最后那个字符
  4.     length //= 2                          # 字符串长度折半,也就是说,后面的循环只需要索引到字符串长度的一半就可以了
  5.     flag = 1                              # 先假定 string 是回文联
  6.     for each in range(length):            # 循环枚举 string 每个字符
  7.         if string[each] != string[last]:  # 如果 string[each] 与 string[len(string) - 1 - each] 不相同
  8.             flag = 0                      # 判定 string 不是回文联
  9.         last -= 1                         # 否则,尾部字符索引指针减一,准备下一次循环比较

  10.     if flag == 1:                         # 如果是回文联
  11.         return 1                          # 返回 1 (True)
  12.     else:                                 # 否则
  13.         return 0                          # 返回 0 (False)
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-23 16:16:40 | 显示全部楼层
kklnkklnkkln 发表于 2019-3-23 16:12
这一串没有看懂,为什么 last = length -1
length // =2
不懂是什么意义

last是字符串最后一个字符下标啊,
length//=2,地板除啊,不管输入的字符串位数是奇数还是偶数,下标都只取字符串长度的一半,首位比较一一对应。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-23 16:57:55 | 显示全部楼层
jackz007 发表于 2019-3-23 16:14
在 palindrome(string) 中,先假定 string 是回文联 (flag = 1),然后通过循环(for each in range(l ...

last = length-1 的意思不是 长度减1  而是指向最后一个字符吗?
length //= 2      为什么后面只需要一半的可以了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-23 17:28:28 | 显示全部楼层
kklnkklnkkln 发表于 2019-3-23 16:57
last = length-1 的意思不是 长度减1  而是指向最后一个字符吗?
length //= 2      为什么后面只需要 ...

      因为每次对比的是字符串 string 中的 2 个字符,所以,循环次数只需要字符串长度的一半就可以了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-23 18:04:30 | 显示全部楼层
jackz007 发表于 2019-3-23 17:28
因为每次对比的是字符串 string 中的 2 个字符,所以,循环次数只需要字符串长度的一半就可以了。

last = length-1 为什么是索引最后一个字符,
我知道分片中 -1是从最后一个字符开始计算,但是这里是长度-1啊?,或者说得出来的长度-1 可以索引?不是很懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-23 18:11:53 | 显示全部楼层
本帖最后由 jackz007 于 2019-3-23 18:26 编辑

     因为长度为 length 的字符串不是从 1 而是从 0 开始索引的,这样,第一个字符索引是 0,那么,最后一个字符索引自然就是 length - 1 了。

     last 初值是 len(string)  - 1,在循环中的值是 len(string) - 1 - each,例如,首次循环(each = 0) last = len(string) - 1,第二次循环(each = 1) last = len(string) - 2,第三次循环(each = 2) last = len(string) - 3 ... 第 n 次循环(each = n - 1) last = len(string) - n。这样,首指针(each)和尾指针(last)在循环中分别向字符串 string 的尾部和头部方向相向移动,最终在字符串中部会合,字符比较操作就完成了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-27 14:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表