鱼C论坛

 找回密码
 立即注册
查看: 1907|回复: 4

[已解决]20讲课后题,为什么这代码跑出来是空的

[复制链接]
发表于 2020-3-13 14:02:00 | 显示全部楼层 |阅读模式

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

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

x
关于1道题的2个问题哈~

课后题为:找出藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:a) 每位密码为单个小写字母;b) 每位密码的左右两边均有且只有三个大写字母,为了让题目简洁

1、代码中的字符段用参考答案可以跑出数据,但这样不行,求指点问题:
  1. str1 = ('''xhstMWpHdZzqeEnttlAHiWbhbIJpwKBAGsFWthBiwBDKTFzIUamELZJFLbmqOmwBIYBJIofAUyxTLUEm
  2. LcOXzjIHFcfUfEWccbWzhVuIZMdTVsOaNsLTpHjrvFaYTnJUrqaYnUmbobfOXXtkjKjFUEhVNlPWeaIY
  3. uABNuEDKFWiUaqQiBHGsgEmDSKiJKLkkzFWlobXIyUlDzGcwDnEOwwWxgFpebsslmKItazIYctPROSJp''')
  4. list1 = []
  5. list2 = list(str1)

  6. for each in list2:
  7.     if each.islower():
  8.         a = str1.find(each)
  9.         if str1[(a-3):a].isupper():
  10.             if str1[(a+1):(a+4)].isupper():
  11.                 if not str1[a-4].isupper():
  12.                     if not str1[a+4].isupper():
  13.                         print(each)
  14.                         list1.append(each)
  15. list3 = str(list1)
  16. print(list3)
复制代码


2、参考答案中有几处看不懂,标在注释中,求指点:
  1. str1 = ('''xhstMWpHdZzqeEnttlAHiWbhbIJpwKBAGsFWthBiwBDKTFzIUamELZJFLbmqOmwBIYBJIofAUyxTLUEm
  2. LcOXzjIHFcfUfEWccbWzhVuIZMdTVsOaNsLTpHjrvFaYTnJUrqaYnUmbobfOXXtkjKjFUEhVNlPWeaIY
  3. uABNuEDKFWiUaqQiBHGsgEmDSKiJKLkkzFWlobXIyUlDzGcwDnEOwwWxgFpebsslmKItazIYctPROSJp''')

  4. countA = 0
  5. countB = 0
  6. countC = 0

  7. length = len(str1)

  8. for i in range(length):
  9.     if str1[i] == '\n':
  10.         continue

  11.     if str1[i].isupper():
  12.         if countB:              #已设定countB = 0,为什么这里可以 if countB()?
  13.             countC += 1
  14.         else:
  15.             countC = 0
  16.             countA += 1

  17.     if str1[i].islower():
  18.         if countA != 3:        
  19.             countA = 0
  20.             countB = 0
  21.             countC = 0
  22.         else:
  23.             if countB:          #这个if else不理解
  24.                 countA = 0
  25.                 countB = 0
  26.                 countC = 0
  27.             else:
  28.                 countB = 1
  29.                 countC = 0
  30.                 target = i

  31.     if countA == 3 and countC == 3:
  32.         if i+1 != length and str1[i+1].isupper():
  33.             countB = 0
  34.             countC = 0
  35.         else:
  36.             print(str1[target],end=' ')
  37.             countA = 3           #为什么这里不是 = 0?
  38.             countB = 0
  39.             countC = 0
复制代码
最佳答案
2020-3-13 15:21:43
本帖最后由 txxcat 于 2020-3-13 15:22 编辑

你的代码的问题是"a = str1.find(each)"这行,你要获取小写字母的位置,可是一个小写字母会重复出现若干次,而a只是第一个小写字母的位置,所以不可能出答案,其实获得字母的位置很简单,利用计数器,每次迭代加1,a就是真实的位置了。
  1. str1 = ('''xhstMWpHdZzqeEnttlAHiWbhbIJpwKBAGsFWthBiwBDKTFzIUamELZJFLbmqOmwBIYBJIofAUyxTLUEm
  2. LcOXzjIHFcfUfEWccbWzhVuIZMdTVsOaNsLTpHjrvFaYTnJUrqaYnUmbobfOXXtkjKjFUEhVNlPWeaIY
  3. uABNuEDKFWiUaqQiBHGsgEmDSKiJKLkkzFWlobXIyUlDzGcwDnEOwwWxgFpebsslmKItazIYctPROSJp''')
  4. list1 = []
  5. list2 = list(str1)
  6. a=0   #增加这行
  7. for each in list2:
  8.     if each.islower():
  9. #        a = str1.find(each)   #删除这行
  10.         if str1[(a-3):a].isupper():
  11.             if str1[(a+1):(a+4)].isupper():
  12.                 if not str1[a-4].isupper():
  13.                     if not str1[a+4].isupper():
  14.                         print(a,each)
  15.                         list1.append(each)
  16.     a+=1    #增加这行
  17. list3 = str(list1)
  18. print(list3)

复制代码

加了2行,删除1行就可以运行了,但是答案多了一个字母,是受到了'\n'的干扰,你把isupper的检查换成依次检查每个字母而不是检查3个字母的字符串就可以排除这个干扰了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-13 15:21:43 | 显示全部楼层    本楼为最佳答案   
本帖最后由 txxcat 于 2020-3-13 15:22 编辑

你的代码的问题是"a = str1.find(each)"这行,你要获取小写字母的位置,可是一个小写字母会重复出现若干次,而a只是第一个小写字母的位置,所以不可能出答案,其实获得字母的位置很简单,利用计数器,每次迭代加1,a就是真实的位置了。
  1. str1 = ('''xhstMWpHdZzqeEnttlAHiWbhbIJpwKBAGsFWthBiwBDKTFzIUamELZJFLbmqOmwBIYBJIofAUyxTLUEm
  2. LcOXzjIHFcfUfEWccbWzhVuIZMdTVsOaNsLTpHjrvFaYTnJUrqaYnUmbobfOXXtkjKjFUEhVNlPWeaIY
  3. uABNuEDKFWiUaqQiBHGsgEmDSKiJKLkkzFWlobXIyUlDzGcwDnEOwwWxgFpebsslmKItazIYctPROSJp''')
  4. list1 = []
  5. list2 = list(str1)
  6. a=0   #增加这行
  7. for each in list2:
  8.     if each.islower():
  9. #        a = str1.find(each)   #删除这行
  10.         if str1[(a-3):a].isupper():
  11.             if str1[(a+1):(a+4)].isupper():
  12.                 if not str1[a-4].isupper():
  13.                     if not str1[a+4].isupper():
  14.                         print(a,each)
  15.                         list1.append(each)
  16.     a+=1    #增加这行
  17. list3 = str(list1)
  18. print(list3)

复制代码

加了2行,删除1行就可以运行了,但是答案多了一个字母,是受到了'\n'的干扰,你把isupper的检查换成依次检查每个字母而不是检查3个字母的字符串就可以排除这个干扰了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-16 13:27:32 | 显示全部楼层
txxcat 发表于 2020-3-13 15:21
你的代码的问题是"a = str1.find(each)"这行,你要获取小写字母的位置,可是一个小写字母会重复出现若干次 ...

懂了,多谢~
求解答案中的几个不懂的地方
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-16 16:17:00 | 显示全部楼层
miusa 发表于 2020-3-16 13:27
懂了,多谢~
求解答案中的几个不懂的地方
  1. str1 = ('''xhstMWpHdZzqeEnttlAHiWbhbIJpwKBAGsFWthBiwBDKTFzIUamELZJFLbmqOmwBIYBJIofAUyxTLUEm
  2. LcOXzjIHFcfUfEWccbWzhVuIZMdTVsOaNsLTpHjrvFaYTnJUrqaYnUmbobfOXXtkjKjFUEhVNlPWeaIY
  3. uABNuEDKFWiUaqQiBHGsgEmDSKiJKLkkzFWlobXIyUlDzGcwDnEOwwWxgFpebsslmKItazIYctPROSJp''')

  4. countA = 0
  5. countB = 0
  6. countC = 0

  7. length = len(str1)

  8. for i in range(length):
  9.     if str1[i] == '\n':
  10.         continue

  11.     if str1[i].isupper():
  12.         if countB:
  13.         #这是在for循环里运行,虽然第一次循环countB是0,但后面的循环中碰到有3个大写加一个小写countB会被修改为1,
  14.         #这时就会对countC进行计算以判断右边是否有3个大写字母。
  15.             countC += 1
  16.         else:
  17.             countC = 0
  18.             countA += 1

  19.     if str1[i].islower():
  20.         if countA != 3:       #如果小写字母左边大写子母不足3个,计数清零
  21.             countA = 0
  22.             countB = 0
  23.             countC = 0
  24.         else:                 #左边出现过3个连续大写字母而且当前字母是小写进入下面判断
  25.             if countB:        #如果countB为1,说明上一个字母是小写字母,计数清零
  26.                 countA = 0
  27.                 countB = 0
  28.                 countC = 0
  29.             else:             #剩余的情况是3个连续大些字母加一个小写字母,把countB赋值为1,记录下位置target
  30.                 countB = 1
  31.                 countC = 0
  32.                 target = i

  33.     if countA == 3 and countC == 3:
  34.         if i+1 != length and str1[i+1].isupper():
  35.             countB = 0
  36.             countC = 0
  37.         else:
  38.             print(str1[target],end=' ')
  39.             countA = 3
  40.            #找到了一个符合条件的字母,继续往下找的时候,右边的3个大写字母就成为了可能的下一个字母的左边3个字母了,
  41.            #如果countA置为0,这3个大写字母就会被忽略,例如,'ABCaDEFbFHIccc',按照规则是'ab',如果countA为0,则b会被漏掉
  42.             countB = 0
  43.             countC = 0

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 13:17:29 | 显示全部楼层

明白了,多谢~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 23:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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