鱼C论坛

 找回密码
 立即注册
查看: 921|回复: 6

零基础第20讲 动动手01题 答案有误?

[复制链接]
发表于 2019-5-30 15:47:09 | 显示全部楼层 |阅读模式

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

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

x
好像课后的标准答案如果输入的字符串是AAAaAAA BBB这种情况下,就无法正确检测a其实是不符合标准的。
  1. str1 = '''ABSaDKS
  2. FbRIHcRHGcdDIF''' #我在小甲鱼原代码的S后面加了个空格和一个F。

  3. countA = 0  # 统计前边的大写字母
  4. countB = 0  # 统计小写字母
  5. countC = 0  # 统计后边的大写字母
  6. length = len(str1)

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

  10.     """
  11.     |如果str1[i]是大写字母:
  12.     |-- 如果已经出现小写字母:
  13.     |-- -- 统计后边的大写字母
  14.     |-- 如果未出现小写字母:
  15.     |-- -- 清空后边大写字母的统计
  16.     |-- -- 统计前边的大写字母
  17.     """
  18.     if str1[i].isupper():
  19.         if countB:
  20.             countC += 1
  21.         else:
  22.             countC = 0
  23.             countA += 1

  24.     """
  25.     |如果str1[i]是小写字母:
  26.     |-- 如果小写字母前边不是三个大写字母(不符合条件):
  27.     |-- -- 清空所有记录,重新统计
  28.     |-- 如果小写字母前边是三个大写字母(符合条件):
  29.     |-- -- 如果已经存在小写字母:
  30.     |-- -- -- 清空所有记录,重新统计(出现两个小写字母)
  31.     |-- -- 如果该小写字母是唯一的:
  32.     |-- -- -- countB记录出现小写字母,准备开始统计countC
  33.     """
  34.     if str1[i].islower():
  35.         if countA != 3:
  36.             countA = 0
  37.             countB = 0
  38.             countC = 0
  39.         else:
  40.             if countB:
  41.                 countA = 0
  42.                 countB = 0
  43.                 countC = 0
  44.             else:
  45.                 countB = 1
  46.                 countC = 0
  47.                 target = i

  48.     """
  49.     |如果前边和后边都是三个大写字母:
  50.     |-- 如果后边第四个字母也是大写字母(不符合条件):
  51.     |-- -- 清空记录B和C,重新统计
  52.     |-- 如果后边仅有三个大写字母(符合所有条件):
  53.     |-- -- 打印结果,并清空所有记录,进入下一轮统计
  54.     """
  55.     if countA == 3 and countC == 3:
  56.         if i+1 != length and str1[i+1].isupper():
  57.             countB = 0
  58.             countC = 0
  59.         else:
  60.             print(str1[target], end='')
  61.             countA = 3
  62.             countB = 0
  63.             countC = 0
复制代码


这个程序运行,第一个小写a会打印出来,但其实第一个小写a并不符合。


标答在这个题目中不会出现差错因为没有出现AAAaAAA后面跟空格的情况,但是我自己的代码碰到了这个空格的问题,像a AAaAAA的情况,就会认为第二个a前有3个.isupper()为true的字符串,导致多打印了两个其实是不符合要求的字母。
  1. string='''字符串'''
  2. index = 0
  3. for each in string:
  4.     if each.islower():
  5.         if string[index-4].islower() and string[(index-3):index].isupper() \
  6.         and string[(index+1):index+4].isupper() and string[index+4].islower():
  7.             print(each)
  8.             print(index)
  9.     index += 1
复制代码



为了根本性解决这个问题,我的方法是在定义完字符串以后就先加这两行代码:
  1. while '\n' in string:
  2.     space = string.find('\n')
  3.     string = string[:space] + string[space+1:]
复制代码

把空格都去掉就行了。。。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-30 19:18:51 | 显示全部楼层
# 找出密码
x ="""AaA  Q A AaAAAa
AAA CCCaBBB"""
list1 = []# 直接定位小写字母,用列表存起来他们的索引
for each in enumerate(x):
    if each[1].islower() and 2 < each[0] < len(x) - 3:
        list1.append(each[0])
#print(list1)
list2 = []
for i in list1:#以list1中元素为索引进行检验
    f = 0
    for k in range(-3,4):
        if x[i + k].isupper():
            f += 1
    if f == 6:
        list2.append(x[i])
result = "".join(list2)
print(result)
参考下我写的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-30 21:11:17 | 显示全部楼层
都淡忘 发表于 2019-5-30 19:18
# 找出密码
x ="""AaA  Q A AaAAAa
AAA CCCaBBB"""

你的代码运行起来会打印一次a,但是按照实际要求应该是1次a都不打?

但是你也让我发现了我之前程序的问题,还需要再加一个
  1. while ' 'in string:
  2.     space = string.find(' ')
  3.     string = string[:space] + string[space+1:]
复制代码

去掉所有空格。。我1楼最后的代码只是去掉了换行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-31 09:38:14 | 显示全部楼层
KingFish-v- 发表于 2019-5-30 21:11
你的代码运行起来会打印一次a,但是按照实际要求应该是1次a都不打?

但是你也让我发现了我之前程序的 ...

最后那里CCCaBBB那里有个密码啊,。。。。没错呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-31 11:09:13 | 显示全部楼层
本帖最后由 都淡忘 于 2019-5-31 11:36 编辑

谢谢你的疑问。我也发现了一个非常错误的地方,要求是两边均有且只有3个大写字母,也就是说AAAAaAAAA这样是不行的,于是我又修改了下代码。如下
  1. x ="""AAAaQQAaA
  2. AAaA
  3. AAcCCaBBBBsDDD"""
  4. list1 = []# 直接定位小写字母,用列表存起来他们的索引
  5. for each in enumerate(x):
  6.     if each[1].islower() and 2 < each[0] < len(x) - 3:
  7.         list1.append(each[0])
  8. list2 = []
  9. if list1[0] == 3:# 直接对第4位密码检验,其后面第四位不能是大写字母
  10.     f = 0;j = 1 if not x[7].isupper() else 0
  11.     if j == 0:
  12.         list1.pop(0)
  13.     else:
  14.         for k in range(-3,4):
  15.             if x[3 + k].isupper():
  16.                 f += 1
  17.         if f == 6:
  18.             list2.append(x[3]);list1.pop(0)
  19. if list1[-1] == len(x) - 4:# 直接对倒数第4位密码检验,其前面第四位不能是大写字母
  20.     f = 0;j = 1 if not x[list1[-1] - 4].isupper() else 0
  21.     if j == 0:
  22.         list1.pop(-1)
  23.     else:
  24.         for k in range(-3,4):
  25.             if x[len(x) - 4 + k].isupper():
  26.                 f += 1
  27.         if f == 6:
  28.             list2.append(x[len(x) - 4]);list1.pop(-1)
  29. for i in list1:#以list1中元素为索引进行检验
  30.     f = 0
  31.     for k in range(-3,4):
  32.         if x[i + k].isupper():
  33.             f += 1
  34.     g = 1 if not x[i - 4].isupper() else 0;j = 1 if not x[i + 4].isupper() else 0
  35.     if f == 6 and g * j == 1:
  36.         list2.append(x[i])
  37. result = "".join(list2)
  38. print(result)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-2 01:53:33 | 显示全部楼层
都淡忘 发表于 2019-5-31 09:38
最后那里CCCaBBB那里有个密码啊,。。。。没错呀

最后那个a左边有6个大写字母嗷。


回复之后新的代码:
你后面改过的代码,按照题意应该会有第一行两个a和第二行那个a,但是只打印了一次。
还是要在代码最前面加上个
  1. while ' 'in x:
  2.     space = x.find(' ')
  3.     x = x[:space] + x[space+1:]
  4. while '\n'in x:
  5.     space = x.find('\n')
  6.     x = x[:space] + x[space+1:]
复制代码

去掉所有换行和空车才能找到正确答案。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 18:09:52 | 显示全部楼层
本帖最后由 都淡忘 于 2019-6-3 18:11 编辑
KingFish-v- 发表于 2019-6-2 01:53
最后那个a左边有6个大写字母嗷。


兄弟,我明白你的意思了,但是三引号只是括住所有字符哦,\n被看作一个字符也是被记录进字符串了哦。
  1. a = "1"
  2. print(len(a))
  3. b = "1\n"
  4. print(len(b))
  5. c = """1
  6. """
  7. print(len(c))
  8. print(b == c)
复制代码

好好看下结果
1
2
3
True
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-16 03:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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