python解决能力很OK?做几题测试一下(3)

2021-12-21 14:27:04 浏览数 (1)

前面写了两篇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才是最短路径。

如何识别实际问题用到那种算法,这个是需要练习的,解决上面问题,也不用太纠结算法这个概念,各种名称,你就按照正常的思路去解这个问题,你能解出来,那么你的方法就是一个算法-解决问题的方法,性能暂时可以不要考虑。

感兴趣后可以去找其它类型的算法试试。

有些之前放过可视化的视频,感兴趣的可以看之前的记录

0 人点赞