前面写了两篇python基础语法的内容,
python基础语法很OK?做几题测试一下
python基础语法很OK?做几题测试一下(2)
相比其它文章阅读量,总体上还是很不错的,可能是里面的任务目标比较明确吧,直接上的题目,并且用到的知识都是非常少的(不涉及到具体领域,比如图像处理),纯粹是逻辑问题,以有限的知识,解决大多数问题应该是大家都比较喜欢的。
在学习编程或者实际生活的过程中,相信大家应该都碰到过各种各样的问题,但是新问题总是层出不穷,感觉学习没有尽头;
这时我们就会思考,有没有那种比较通用的方法,学一个就能够解决一大类问题,多学习几种,那么就可以覆盖很多的问题了。
确实是有的,那就是算法——解决问题的方法,以前我听过一个大佬说过,编程掌握变量,循环,判断,配合上一个递归,能够解决百分八九十的问题。
而实际的问题进行总结归纳,大多数都是属于排序和搜索(查找)匹配问题,当然还有一些其它领域以及最新的机器学习方法,这里就不在讨论。
可以思考一下生活中的一些现象,手机通信录查找某个联系人,查找文件,搜索引擎查找答案,游戏排名,推荐,班级最高分,最低分等等。这些问题是不是都是排序搜索的问题。
看到一个问题,厉害的人总是一眼看出这个问题需要使用什么解决方法,这不就是一个排序问题吗?这不就是一个匹配问题吗?模式识别果然厉害。
比如我是自学的(野路子)编程,以前根本感觉不到算法有什么用,确实很多问题规模比较小,也没有性能要求,暴力算法感觉能够解决一切;直到我用一些常规的方法感觉太慢了,不满足我的要求,我才真实感觉到算法巧妙的魅力。
之前看过《这就是搜索引擎》这本书,里面讲到搜索引擎3个目标以及3个核心问题,以及不同发展时期搜索引擎的变化,觉得非常好:
3个目标
搜索引擎可以说是目前所有互联网应用里技术含量最高的一种,尽管其应用形式非常简单:用户输入查询词,搜索引擎返回搜索结果。但是要为以亿计数的互联网用户提供准确快速的搜索结果,里面包含了很多技术手段。总的来说,搜索引擎技术所希望达到的目标可以归纳为:更全、更快、更准。
3个核心问题
1 用户真正的需求是什么? 2 哪些信息是和用户需求真正相关的? 3 哪些信息是用户可以信赖的?
3个时期
对于第一代文本检索式搜索引擎,其重点关注的是查询关键词和网页内容的相关性。这种搜索方式假定用户输入的查询关键词就是用户的真实需求,很明显这种假设很难成立。另外,这种搜索方式对于信息的可信度也未做任何识别。 第二代搜索引擎引入链接分析技术,链接关系代表了一种推荐含义,而获得越多推荐的网页其链接分析得分越高,这其实是一种对网页可信度的度量标准。 第三代搜索引擎的重点则是用户的真实需求,其他方面则兼顾了第二代搜索引擎的优点,即第三代搜索引擎同时考虑了3个核心问题。
1.找出下列列表中元组数值和最小的一个,同理最大值也是一样大。
代码语言:javascript复制[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14), (15, 16, 17), (18, 19, 20), (21, 22, 23), (24, 25, 26)]
结果:
代码语言:javascript复制最小值:(0, 1, 2)
最大值:(24, 25, 26)
2.找出下列列表中出现次数最多的元素,并打印出次数。
代码语言:javascript复制l = [1,3,4,5,6,1,3,4,5,1,9,1,1,1]
结果:
代码语言:javascript复制1出现最多,次数6次。
3.找零钱问题
给定可找的零钱种类,以及待找的零钱总数,求出最少的零钱数量方案。
比如找6元零钱,
方案1: 4 1 1;
方案2: 3,3;
方案3:3,1,1,1;
方案4:1,1,1,1,1,1;
明显方案2找的数量最少,只有2。
代码语言:javascript复制values = [1, 3, 4] # 硬币面值
total = 6 # 需要找零钱总值
结果:
代码语言:javascript复制[3,3]
4.数独4
利用程序自动完成4*4数独
代码语言:javascript复制[[0, 1, 0, 0],
[0, 0, 0, 2],
[3, 0, 0, 0],
[0, 0, 4, 0]]
结果:
5.数独9
加大难度,利用程序自动完成9*9数独。
代码语言:javascript复制[[2, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 3, 6, 0, 0, 0, 0, 0],
[0, 7, 0, 0, 9, 0, 2, 0, 0],
[0, 5, 0, 0, 0, 7, 0, 0, 0],
[0, 0, 0, 0, 4, 5, 7, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 3, 0],
[0, 0, 1, 0, 0, 0, 0, 6, 8],
[0, 0, 8, 5, 0, 0, 0, 1, 0],
[0, 9, 0, 0, 0, 0, 4, 0, 0]]
结果:很多种答案,下面只是列出了一些。
6.迷宫问题
给定一个大小为5*6的迷宫,由通道(0)和墙壁(1)组成,其中通道左上角表示起点,通道右下角表示终点,找到迷宫路径。
代码语言:javascript复制maze = [[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 1, 0],
[1, 1, 1, 0, 0],
[0, 1, 0, 0, 1],
[0, 1, 0, 0, 0]]
结果:
代码语言:javascript复制[[0, 0], [1, 0], [1, 1], [1, 2], [0, 2], [0, 3], [0, 4],
[1, 4], [2, 4], [3, 4], [3, 3], [4, 3], [5, 3], [5, 4]]
7.迷宫问题2-最短路径。
给定一个大小为5*5的迷宫,由通道(0)和墙壁(1)组成,其中通道左上角表示起点,通道右下角表示终点,找到迷宫最短路径。
代码语言:javascript复制maze = [[0, 1, 0, 0, 0,],
[0, 1, 0, 1, 0,],
[0, 0, 0, 0, 0,],
[0, 1, 1, 1, 0,],
[0, 0, 0, 1, 0,]]
这里有两种方案,不过方案2才是最短路径。
如何识别实际问题用到那种算法,这个是需要练习的,解决上面问题,也不用太纠结算法这个概念,各种名称,你就按照正常的思路去解这个问题,你能解出来,那么你的方法就是一个算法-解决问题的方法,性能暂时可以不要考虑。
感兴趣后可以去找其它类型的算法试试。
有些之前放过可视化的视频,感兴趣的可以看之前的记录