鱼C论坛

 找回密码
 立即注册
查看: 2098|回复: 2

[已解决]关于第18讲 灵活即强大的问题求助

[复制链接]
发表于 2019-2-20 12:25:26 | 显示全部楼层 |阅读模式

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

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

x
def findStr(desStr, subStr):
    count = 0
    length = len(desStr)
    if subStr not in desStr:
        print('在目标字符串中未找到字符串!')
    else:
        for each1 in range(length-1):      
            if desStr[each1] == subStr[0]:
                if desStr[each1+1] == subStr[1]:
                    count += 1
                    
        print('子字符串在目标字符串中共出现 %d 次' % count)

desStr = input('请输入目标字符串:')
subStr = input('请输入子字符串(两个字符):')
findStr(desStr, subStr)


# 课后第18讲   灵活即强大
‘ ‘ ‘
上面这道题else语句里面的内容怎么理解?

‘ ‘ ‘
最佳答案
2019-2-20 12:48:01
本帖最后由 jackz007 于 2019-2-20 13:23 编辑
  1. def findStr(desStr, subStr):
  2.     count = 0
  3.     length = len(desStr)
  4.     if subStr not in desStr:                                   # 如果子字符串没有出现在目标字符串当中
  5.         print('在目标字符串中未找到字符串!')                     # 屏幕显示相应信息
  6.     else:                                                      # 否则
  7.         for each1 in range(length-1):                          # 循环,按索引 0 到 len(desStr) - 1 遍历字符串 desStr 中的每 1 个字符。之所以确定范围是 0 ~ len(desStr) - 1 是因为搜索是按照 2 个字符为 1 组进行的,总共需要循环  len(desStr) - 1 次     
  8.             if desStr[each1] == subStr[0]:                     # 比较 desStr[each1] 是否与 subStr 的第 1 个字符相同
  9.                 if desStr[each1+1] == subStr[1]:               # 如果前面的比较相等,再比较 desStr[each1 + 1] 是否与 subStr 的第 2 个字符相同
  10.                     count += 1                                 # 如果前面两个字符比较都相同,那么,计数器加 1
  11.                     
  12.         print('子字符串在目标字符串中共出现 %d 次' % count)      # 搜索完毕,屏显输出计数结果

  13. desStr = input('请输入目标字符串:')
  14. subStr = input('请输入子字符串(两个字符):')
  15. findStr(desStr, subStr)
复制代码


      其实,这个代码是有缺陷的,在极端情况下,例如:desStr = 'aaaaaaaaa' , subStr = 'aa' 的时候,这个代码给出的结果将是错误的。因为在没有找到 subStr 的情况下,each1 每次循环增 1 是正确的,但是,如果找到了,那么,增加的值显然应该是 2,而不应该还是 1。

      所以,原代码应该这么改:
  1. def findStr(desStr, subStr):
  2.     count = 0
  3.     length = len(desStr)
  4.     if subStr not in desStr:
  5.         print('在目标字符串中未找到字符串!')
  6.     else:
  7.         each1 = 0
  8.         while(each1 < length - 1):
  9.             if desStr[each1] == subStr[0]:
  10.                 if desStr[each1+1] == subStr[1]:
  11.                     each1 += 1
  12.                     count += 1
  13.             each1 += 1
  14.                     
  15.         print('子字符串在目标字符串中共出现 %d 次' % count)

  16. desStr = input('请输入目标字符串:')
  17. subStr = input('请输入子字符串(两个字符):')
  18. findStr(desStr, subStr)
复制代码


     楼主不妨比较一下看看。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-2-20 12:48:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-2-20 13:23 编辑
  1. def findStr(desStr, subStr):
  2.     count = 0
  3.     length = len(desStr)
  4.     if subStr not in desStr:                                   # 如果子字符串没有出现在目标字符串当中
  5.         print('在目标字符串中未找到字符串!')                     # 屏幕显示相应信息
  6.     else:                                                      # 否则
  7.         for each1 in range(length-1):                          # 循环,按索引 0 到 len(desStr) - 1 遍历字符串 desStr 中的每 1 个字符。之所以确定范围是 0 ~ len(desStr) - 1 是因为搜索是按照 2 个字符为 1 组进行的,总共需要循环  len(desStr) - 1 次     
  8.             if desStr[each1] == subStr[0]:                     # 比较 desStr[each1] 是否与 subStr 的第 1 个字符相同
  9.                 if desStr[each1+1] == subStr[1]:               # 如果前面的比较相等,再比较 desStr[each1 + 1] 是否与 subStr 的第 2 个字符相同
  10.                     count += 1                                 # 如果前面两个字符比较都相同,那么,计数器加 1
  11.                     
  12.         print('子字符串在目标字符串中共出现 %d 次' % count)      # 搜索完毕,屏显输出计数结果

  13. desStr = input('请输入目标字符串:')
  14. subStr = input('请输入子字符串(两个字符):')
  15. findStr(desStr, subStr)
复制代码


      其实,这个代码是有缺陷的,在极端情况下,例如:desStr = 'aaaaaaaaa' , subStr = 'aa' 的时候,这个代码给出的结果将是错误的。因为在没有找到 subStr 的情况下,each1 每次循环增 1 是正确的,但是,如果找到了,那么,增加的值显然应该是 2,而不应该还是 1。

      所以,原代码应该这么改:
  1. def findStr(desStr, subStr):
  2.     count = 0
  3.     length = len(desStr)
  4.     if subStr not in desStr:
  5.         print('在目标字符串中未找到字符串!')
  6.     else:
  7.         each1 = 0
  8.         while(each1 < length - 1):
  9.             if desStr[each1] == subStr[0]:
  10.                 if desStr[each1+1] == subStr[1]:
  11.                     each1 += 1
  12.                     count += 1
  13.             each1 += 1
  14.                     
  15.         print('子字符串在目标字符串中共出现 %d 次' % count)

  16. desStr = input('请输入目标字符串:')
  17. subStr = input('请输入子字符串(两个字符):')
  18. findStr(desStr, subStr)
复制代码


     楼主不妨比较一下看看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-20 12:53:19 | 显示全部楼层
for each1 in range(length-1):      
    if desStr[each1] == subStr[0]:
        if desStr[each1+1] == subStr[1]:
            count += 1
具体如下:
1,用循环控制 遍历整个目标字符串;
2,由于需要到比对的子串是两个;
3,if desStr[each1] == subStr[0]: 用if来判断子串的第一个在目标串的位置
4,在子串第一个成功的情况下再用 if desStr[each1+1] == subStr[1]来判断子串的第二个是不是在目标串中紧跟其后的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 15:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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