鱼C论坛

 找回密码
 立即注册
查看: 5199|回复: 20

[技术交流] 第20讲习题代码以及分析(二)

[复制链接]
发表于 2014-7-31 15:59:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 mumudontcry 于 2014-7-31 22:55 编辑

第一行喂@小甲鱼  ,第二行开始
题目我还是不说了(免责声明:要先好好看小甲鱼的好不啦,全让我说了,人家干什么去,再说把题目弄过来,小甲鱼的10鱼币就赚不了啦)

动动手
0
首先我要说,并不是说,这一讲讲的内容是什么,你就一定要用上这个知识
所以说,这两个程序我们都不需要用上函数,看题目的要求就知道,没有说,也没有一定要用的迹象

所以,我们就要用字符串什么的么?

错错错错错!!!!!木木在这里郑重告诉你,什么都不要用!咱们这次不写程序,傲娇的木木已经被上一篇的内容搞糊涂了,不想写程序了,所以,这次,你们看着办,反正木木就是不想写程序了

众人:哇靠!不讲程序,那你来干什么!小甲鱼,把他关起来!

木木:不要啦,不写程序不代表咱们不讲题目是吧?我只是不想写程序……好吧,你们接着往下看

我们仔细看题目:统计下边这个长字符串中各个字符出现的次数并找到小甲鱼送给大家的一句话
木木:嗯……接受挑战!请大家跟着我做:
首先,打开记事本
然后,观察这字符串,也就是!@#$%^&*()_+[]{}的组合
然后,按ctrl+H,如图所示,大家可能就明白我要干嘛了
然后,你们懂的,把所有的上面的字符串每个字符换成:空(就是不输入)
然后你们就看得到小甲鱼的话了

众人:哇靠靠靠靠!!!你他喵在逗我?!

额……木木想说:
写程序是为了更方便地去解决现实里的问题,如果你有比写程序更好更快的方法,那么你干嘛硬要写程序呢?写程序是一件很累的活,我们的目的是更好的生活,不是找累,所以,思维不要局限于编程
(瞬间觉得我好高大上啦啦啦啦啦啦

于是有人提出:不行!题目要求是——“请用已学过的知识编写程序,”然后才是上面的那段话


木木:哦嘞,被你发现了,好吧,我承认我在偷懒,不服?你咬我啊
其实在我看到G的时候,我就想:是GOOD JOB么?然后O——O——D——L,????L?LUCK????结果还真是!
(木木瞬间拿起一块姨妈巾狠狠摔在地上)GOOD LUCK你妹啊!完全没有一点奖励的感觉有木有


就是说,还是要写程序么?哎呀,好麻烦,好吧,这是木木的程序(捂脸,不好意思看):

str1 ="""复制的内容"""
num1 = str1.count('!')
print("!:",num1)

num1 = str1.count('@')
print("@:",num1)

num1 = str1.count('#')
print("#:",num1)

num1 = str1.count('$')
print("$:",num1)

num1 = str1.count('%')
print("%:",num1)

num1 = str1.count('^')
print("^:",num1)

num1 = str1.count('&')
print("&:",num1)

num1 = str1.count('*')
print("*:",num1)

num1 = str1.count('(')
print("(:",num1)

num1 = str1.count(')')
print("):",num1)

num1 = str1.count('_')
print("_:",num1)

num1 = str1.count('+')
print("+:",num1)

num1 = str1.count('[')
print("[:",num1)

num1 = str1.count(']')
print("]:",num1)

num1 = str1.count('{')
print("{:",num1)

num1 = str1.count('}')
print("}:",num1)

num1 = str1.count('\n')
print("换行:",num1)
str2 =''
for i in str1:
    if not(i == '!' or i == '@' or i == '#' or i == '$' or i == '%' or i == '^' or i == '&' or i == '*' or i == '(' or i == ')' or i == '_' or i == '+' or i == '[' or i == ']' or i == '{' or i == '}' or i == '\n'):
        str2 += i
print(str2)


众人:哇靠!!这次木木真的来坑爹了!!

木木:对啊对啊!你咬我啊!!我想说:

如果你有很简单的方法,为什么不用呢?虽然看起来好像不会那么牛逼,但是,不管黑猫白猫,抓到老鼠就是好猫,这跟开始的替换法是一样的。我们要做程序员,不是做看似酷毙其实苦逼的程序员,没有必要折磨自己,只要能解决问题,就行了!
当然,在解决问题的基础上,如果你还要找到更好的方法,就是另外一回事了


然后,我说了不想写,就是不想写,但我没说不给你们讲小甲鱼的答案(我真傲娇)
list1 = []

for each in str1:
    if each not in list1:
        if each == '\n':
            print('\\n', str1.count(each))
        else:
            print(each, str1.count(each))
        list1.append(each)

小甲鱼的思路是:
a、创建一个空列表
b、然后在源字符串里从头开始取字符,如果字符不在这个列表里,那么,就打印这个字符,并且利用字符串函数count打印这个字符在源字符串中出现的次数,由于换行比较特殊,即使你打印了还是看不出来,所以,这里单独对换行处理。最后,把刚才取出来的字符放到该空列表末尾,循环b

对于这个程序,我有句话说,其实使用count并不好,因为count的话,本身的实现应该也是使用了循环,然后再循环,相当于两层循环,就像小甲鱼之前说的关于len函数,如果放在循环体内,效率会降低,那么这个count放在循环体内,效率应该也是会降低的

所以,比较好的方法是:让each循环str1,用一个列表记录每种字符出现的个数,这个列表上的每个元素就是对应字符的累加器,等到循环结束了,所有累加器累加结束,再打印各个累加器的值,这样做只使用了一层循环,而且这个列表的长度明显比之前的要短很多,效率自然就会提高不少

嗯……咱们电脑很强大,效率什么的从来就不是问题~whatever~~~技能get!!

木木的程序虽然看起来并不好看,但是!但是~~但是……但是!@#$%^&*()_+[]{}balabalabal即使如此,也就只有一层循环,不过是非常多个一层循环,学过“时间复杂度”的知道,我的程序时间复杂度是O(n),如果说in也是有隐藏循环属性的话(我觉得真的有耶!!),那么小甲鱼的时间复杂度就是O(n^3)(因为for里有个if判断in,在这个if里还有count,所以是n^3),运行时间是木木的三倍!!!从效率上说,木木的程序完爆小甲鱼!
小甲鱼,你说呢?


1
这一讲,木木不会把程序写得很复杂,如果要看复杂的,就去看小甲鱼的,因为,按照小甲鱼的说法,“请用已学过的知识编写程序”,木木比较喜欢简单无脑粗暴的句子,除非,这种句子效率低,会报错以及等等木木不喜欢看到的
写程序就是要简单!
是时候表演真正的技术了
这是木木的:
#str1一开始要做处理,在它之前至少需要一个字符,不然有可能因为字符串不同而得不到正确结果,这里我写的是……
str1 = "木木萌萌哒" + str1

l = len(str1)


#为了更好看清判断句里写的是什么,我加了颜色
for i in range(l-8):
    if not str1.isupper() and str1[i+1].isupper() and str1[i+2].isupper() and str1[i+3].isupper() and str1[i+4].islower() and str1[i+5].isupper() and str1[i+6].isupper() and str1[i+7].isupper() and not str1[i+8].isupper():

        print(str1[i+4],end='')
一看就懂,就是判断连续的九个字符是不是符合题目的要求
唯一值得注意的是那个“l-8”,一定要是这个,不然程序有可能因为字符串的不同导致报错,嗯……应该不难理解吧

小甲鱼的:
(我才不会搬代码过来呢!)
解释一下部分参数的含义,你们自己举例子参照代码去读,不难懂,只不过我在举例子的时候,有一种上上下下的感觉(读了你就知道)
countA用来判断前面三个是不是大写
countB用来判断中间的是不是小写
countC用来判断后面三个是不是大写

虽然程序最后实现了要求的功能,但是,就拿这个字符串的前面7个字符来说,在i循环到第七个字符I的时候,其实第一个if还在执行,这个时候countC居然是等于4的!当然countC等于4的时候,是不会打印结果的,因为第三个if判断了,当countC等于3的时候打印
即使这样,程序执行的时候还是有相当多的计算是白费的,可以加上一些条件,比如第一个if里加上,countC == 4 continue,具体怎么写,你们自己实现,这里木木就不写了

经过一天的努力,木木终于当上总经理,出任CEO,迎娶……额不,打败甲鱼大魔王,为世界赢得了一天的和平
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
点击
当没节操甲鱼遇上傲娇笨笨的木木
查看我的淘帖,喜欢就点“订阅”吧









QQ截图20140731153710.png

评分

参与人数 1荣誉 +2 鱼币 +4 贡献 +2 收起 理由
bevin + 2 + 4 + 2

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2014-7-31 16:11:11 | 显示全部楼层
嘿嘿,居然这一讲还是有续集的。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 16:28:25 | 显示全部楼层
完全不知道你在讲什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 16:34:07 | 显示全部楼层
h1006272147 发表于 2014-7-31 16:28
完全不知道你在讲什么

因为你没有做题目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 16:35:35 | 显示全部楼层
小甲鱼 发表于 2014-7-31 16:11
嘿嘿,居然这一讲还是有续集的。。。

因为比较重要啊,我把测试题和动动手分开了讲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 16:38:33 | 显示全部楼层
mumudontcry 发表于 2014-7-31 16:34
因为你没有做题目

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

使用道具 举报

 楼主| 发表于 2014-7-31 16:39:43 | 显示全部楼层
h1006272147 发表于 2014-7-31 16:38
你讲的Delphi的20讲吗?

我是在python版块下发的帖子,怎么是delphi
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 16:41:51 | 显示全部楼层
mumudontcry 发表于 2014-7-31 16:39
我是在python版块下发的帖子,怎么是delphi

在空间看到的,没注意看版块,以为Delphi,难怪看不懂。撸主不好意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 16:43:15 | 显示全部楼层
mumudontcry 发表于 2014-7-31 16:39
我是在python版块下发的帖子,怎么是delphi

接下来是准备要学python,视频已准备好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 18:05:44 | 显示全部楼层
小甲鱼 发表于 2014-7-31 16:11
嘿嘿,居然这一讲还是有续集的。。。

我发现我的鱼币越用越多,是奖励的么

点评

是的,我们要鼓励多交流多分享!  详情 回复 发表于 2014-7-31 21:25
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 19:54:37 | 显示全部楼层
呵呵  不错不错。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 21:25:48 | 显示全部楼层
mumudontcry 发表于 2014-7-31 18:05
我发现我的鱼币越用越多,是奖励的么

是的,我们要鼓励多交流多分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 22:52:12 | 显示全部楼层
本帖最后由 mumudontcry 于 2014-7-31 23:00 编辑
小甲鱼 发表于 2014-7-31 16:11
嘿嘿,居然这一讲还是有续集的。。。

突然发现,第0题的效率居然比你的高,于是我又傲娇地加了一段蓝色的字在第0题讲完的末尾说明这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 11:25:34 | 显示全部楼层
小甲鱼 发表于 2014-7-31 21:25
是的,我们要鼓励多交流多分享!

我要怎么做才可以让.py双击就可以执行
或者说打开idle
我的.py现在是用记事本打开的,要怎么关联
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-1 11:40:34 | 显示全部楼层
把每个列出来好麻烦,我是直接用find()函数的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-1 11:51:31 | 显示全部楼层
墨子坤 发表于 2014-8-1 11:40
把每个列出来好麻烦,我是直接用find()函数的

你find到一个新的字符,还是要列出来统计吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-1 12:05:25 | 显示全部楼层
这是在编剧吗???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-2 16:57:56 | 显示全部楼层
谢谢楼主分享,非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-22 10:28:07 | 显示全部楼层
本帖最后由 破渔网兜兜 于 2014-9-22 10:32 编辑
str1 = '''
asABCcDWDd
ABCcDWDdAAA
s
'''
l = len(str1)
for i in range(l-8):
    if not str1.isupper() and str1[i+1].isupper() and str1[i+2].isupper() and str1[i+3].isupper() and str1[i+4].islower() and str1[i+5].isupper() and str1[i+6].isupper() and str1[i+7].isupper() and not str1[i+8].isupper():
        print(str1[i+4],end='')
运行结果是ccd,但是目测应该是cdcd,似乎没有判断空格吧,第一行的d应该是符合条件的,怎么改才对呢
str1 = '''
asABCcDWDd
ABCcDWDdAAA
s
'''
l = len(str1)
for i in range(l-8):
    if str1[i] == '\n':
        continue
    if not str1.isupper() and str1[i+1].isupper() and str1[i+2].isupper() and str1[i+3].isupper() and str1[i+4].islower() and str1[i+5].isupper() and str1[i+6].isupper() and str1[i+7].isupper() and not str1[i+8].isupper():
        print(str1[i+4],end='')
加了空格判断,似乎也不对哦,这样连续判断感觉不行吧,如果在i+8里面,出现空格,没办法判断出来
@小甲鱼

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

使用道具 举报

 楼主| 发表于 2014-9-22 14:50:58 | 显示全部楼层
破渔网兜兜 发表于 2014-9-22 10:28
运行结果是ccd,但是目测应该是cdcd,似乎没有判断空格吧,第一行的d应该是符合条件的,怎么改才对呢

这个是可以的,因为not,and or有优先级,自己会加括号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 14:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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