python为什么没有指针_Python 没有指针,如何解算法题?

👆“Python猫” ,一个值得加星标的公众号

花下猫语:

今天一大早,读者群里又讨论了 Python 的“指针”问题。之前在公众号里发布过樱雨楼小姐姐的《对比 C++ 和 Python,谈谈指针与引用》,它从概念上有比较清晰的分析。恰好今天还看到青南同学刚发布的一篇文章,它从实用的层面介绍了怎么用 Python 解“指针”类的题目,正好分享一下~

aecd33e41e95e830fe9258ac64cec6168de.png

剧照 | 《如懿传》

原标题:《举一反三:三种问题,两个指针,一种方法》

在我们做算法题的时候,如果大家多总结解题方法,就会发现很多题目的解题方法实际上是完全一样的。今天我们就来看三道链表相关的题目。可以使用同一种方法来解决。

虽然题目中用到了指针,但我们知道,Python 是没有指针的,所以在 Python 里面,这里实际上指的是引用。不过由于“指针”这个词更加形象,所以下文我们还是会用指针来表示对一个对象的应用。

先来看我们将要解决的三道题目:

题目1:只扫描一次链表,O(1)空间复杂度,返回链表倒数第 k 个节点。

题目2:只扫描一次链表,O(1)空间复杂度,返回链表中间的节点。

题目3:空间复杂度(1),查询链表是否有环。

其中前两道题要求只能扫描链表一次。但是大家可能会有疑问,例如对于第2题,都不知道链表一共有多少个节点,怎么可能知道中间的节点是哪个?但如果提前把链表扫描一遍,知道一共有多少个节点了,又不能再次扫描链表,那么就必须把每个节点和序号都存下来,这样空间复杂度就不可能是 O(1)了。

我们先来看看第2题,找到链表中间的节点。

从下图的两个链表可以看到:

2d9499febc2dd725d4c5589b741063f81f1.png

链表有 n 个节点,如果 n 为奇数,那么中间的节点在第 (n + 1) / 2个节点。如果 n 为偶数,那么中间的节点在第n / 2个节点。

这个信息怎么使用呢?我们看下面一个表格:

b0eefeaf98ca5f46e4631677c09fcd15c4c.png

既然如此,如果我们在链表里面有两个指针(引用),其中一个每次移动2个节点,另一个每次移动一个节点。这样当快的指针移动到了末尾,慢的指针刚刚好指向中间的节点。

用代码来表示:

def find_mid(node):

if not node:

return None

if not node.next:

return node

fast = slow = node

while fast.next and fast.next.next:

slow = slow.next

fast = fast.next.next

return slow

返回的 slow 就是最中间的节点。

再来看第3道题。跟第二题一样,也是一快一慢两个指针,如果链表有环,那么快的指针会绕到慢的指针的后面,然后追上来。只要看快的指针是否跟慢的指针重合,就知道是否有环了:

def find_cycle(node):

if not node:

return False

slow = fast = node

while fast:

fast = fast.next

if not fast: # 快的指针到了链表末尾,说明没有环

return False

if fast is slow: # 快的指针追上了慢的指针,说明有环

return True

fast = fast.next

if fast is slow:

return True

slow = slow.next

return False

再来看第一题。跟第二题实际上也是一样的。只不过,这次两个指针是移动速度是一样的。但是,一种一个指针先移动 k 个节点,然后两个指针再开始同时移动。这样两个指针中间始终会间隔 k 个节点。这样一来,当先走的指针到了None,后走的指针刚刚好走到倒数第 k 个节点。

不过,在解决这道题的时候,需要考虑,k 如果大于链表长度的时候,应该要返回错误信息。对应的代码如下:

def find_reverse_k(node, k):

if not node or k == 0:

return None

front = behind = node

window = 0

while front:

window += 1

front = front.next

if window == k:

break

else: # while ... else 语法,如果循环正常结束,就会进入 else

raise Exception('k 比链表长度还长!')

while front:

front = front.next

behind = behind.next

return behind

如果大家观察上面三个问题的解决代码,会发现他们都是使用了两个指针,通过两个指针之间的节点差来解决问题的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用JSON-server模拟REST API(一) 安装运行

用JSON-server模拟REST API(一) 安装运行 在开发过程中,前后端不论是否分离,接口多半是滞后于页面开发的。所以建立一个REST风格的API接口,给前端页面提供虚拟的数据,是非常有必要的。 对比过多种mock工具后,我最终选择…

深度 | 刘群:基于深度学习的自然语言处理,边界在哪里?

来源: AI科技评论 编辑 | Camel四大边界:数据边界、语义边界、符号边界和因果边界当前,深度学习之于自然语言处理,有其局限性。那么它所能起作用的边界在哪里呢?对此问题,我们应当深思。近日,在…

C++char转int和int转char

区别在于0还是-0 char转int&#xff1a;-0 int main(){char c 5;int n c - 0;cout << n << endl;return 0; } int转char:0 int main(){int n 5;char c n0;cout << c << endl;return 0; }

html border阴影效果_【开发小技巧】026—如何使用HTML和CSS创建浮动框阴影效果?...

英文 | https://www.geeksforgeeks.org/how-to-create-floating-box-effect-using-html-and-css/?refrp浮动框效果是自定义框阴影技术的经典示例。在这种技术中&#xff0c;我们无需使用CSS提供的box-shadow属性即可创建逼真的阴影效果。实现方法&#xff1a;在选择器之后使用…

php变量函数,回调函数

一,变量可以直接传递函数 <?php function demo($num , $n )//$n是个函数 {for($i0;$i<$num;$i){if($n($i)){echo $i."<br>";}} } function funcall($i) {return $i%20; } demo(100,"funcall"); 二, 使用call_user_func_array  <?php fu…

NLP这两年:15个预训练模型对比分析与剖析

来源 | 知乎前言在之前写过的《NLP的游戏规则从此改写&#xff1f;从word2vec, ELMo到BERT》一文中&#xff0c;介绍了从word2vec到ELMo再到BERT的发展路径。而在BERT出现之后的这大半年的时间里&#xff0c;模型预训练的方法又被Google、Facebook、微软、百度、OpenAI等极少数…

多余的读写端口什么时候会对程序造成影响_程序员需要了解的硬核知识之控制硬件...

应用和硬件的关系我们作为程序员一般很少直接操控硬件&#xff0c;我们一般通过 C、Java 等高级语言编写的程序起到间接控制硬件的作用。所以大家很少直接接触到硬件的指令&#xff0c;硬件的控制是由 Windows 操作系统 全权负责的。你一定猜到我要说什么了&#xff0c;没错&am…

直击2019WAIC丨李德毅:人工智能是脱离意识的工具,需要约束的是人类自己

转自 上观新闻中国工程院院士、中国人工智能学会理事长李德毅在2019世界人工智能大会“科学前沿”主论坛上表示&#xff0c;人工智能就是人类智能的体外延伸&#xff0c;可以脱离意识而存在&#xff0c;应该将其看作一种工具。李德毅认为&#xff0c;意识和智能相互之间有很多典…

matplotlib给坐标轴特定的位置加上文字

比如我想在横坐标0和1这两个位置分别用文字“y1”和“y2”代替&#xff0c;即实现以下这种效果&#xff1a; plt.xlim([-1, 2]) plt.xticks([0, 1], ["y1", "y2"])

K-Means ++ 算法

Kmeans算法的缺陷 • 聚类中心的个数K 需要事先给定&#xff0c;但在实际中这个 K 值的选定是非常难以估计的&#xff0c;很多时候&#xff0c;事先并不知道给定的数据集应该分成多少个类别才最合适• Kmeans需要人为地确定初始聚类中心&#xff0c;不同的初始聚类中心可能导致…

螺旋桨设计软件_我们又双叒叕获得一项国家软件著作权!

近日中建三局一公司深圳分公司岗厦天元花园项目“实时监测数据可视化与BIM集成展示平台(简称监测数据可视化集成展示平台)V1.0”荣获国家软件著作权该项成果由岗厦天元花园项目与哈尔滨工业大学深圳校区组成的科研团队共同完成该平台能收集钢结构塔冠的水平位移、应变、温度、风…

计算机界和数学界,也需要一个“希波克拉底誓言”

汉娜弗莱&#xff1a; “未来不会就这么来到我们眼前&#xff0c;我们一直在塑造它。”摄影&#xff1a;Paul Wilkinson | The Guardian来源 The Guardian翻译 刘勤编辑 魏潇一位学界的领军人物表示&#xff0c;数学家、工程师以及科学家们应通过一个计算机界的“希波克拉底…

matplotlib显示特殊符号(gamma,alpha,beta)

plt.title(r$\gamma$) plt.title(r$\alpha$) plt.title(r$\beta$)

WCF技术实现基于角色的访问控制

第一次写&#xff0c;小紧张&#xff01; 即将毕业了&#xff0c;现在将我毕业设计中用到的小的编程技术以及自己的一些理解分享出来&#xff0c;希望可以做点小贡献。 首先要感谢网上各路大神无私的分享&#xff0c;没有你们&#xff0c;就没有我的收获。 在大四之前&#xff…

double类型占几个字节_MongoDB 中的数据类型

1 JSON 与 BSONMongoDB 是文档数据库&#xff0c;什么是文档呢&#xff1f;如果你看了之前的文章相信你已经有些概念了&#xff0c;这里的文档不是指 Word、PDF 这样的文档&#xff0c;而是类似 JSON(JavaScript Object Notation) 的对象&#xff0c;由不同的键以及对应的值组成…

每天一个Linux命令(17)--whereis命令

whereis 命令只能用于程序名的搜索&#xff0c;而且只搜索二进制文件&#xff08;参数-b&#xff09;、man说明文件&#xff08;参数-m&#xff09;和源代码文件&#xff08;参数-s&#xff09;。如果省略参数&#xff0c;则返所有信息。 和find相比&#xff0c;whereis查找的速…

李德毅院士:未来交通——自动驾驶与智能网联

图片来源&#xff1a;华龙网转自&#xff1a;主线科技&#xff08;trunktech&#xff09;近日&#xff0c;中国国际智能产业博览会&#xff08;智博会&#xff09;在重庆召开。中国人工智能学会理事长李德毅院士在智博会“人工智能产业发展合作论坛”上&#xff0c;发表了主题为…

C++输入一个整数后接着输入字符串

当我们输入整数&#xff0c;按回车&#xff0c;实际上输入的是:整数和换行符号(\n)。cin把整数读进了&#xff0c;但是换行符号没有读&#xff0c;因此如果接下来输入字符串&#xff0c;即使用cin.getline&#xff0c;首先会读入\n。然后就直接结束了。 下面这个程序需要输入四…

elasticsearch 查看索引_ElasticSearch 索引基本操作

松哥原创的 Spring Boot 视频教程已经杀青&#xff0c;感兴趣的小伙伴戳这里-->Spring BootVue微人事视频教程ElasticSearch 系列第五篇&#xff0c;和大家聊一聊索引的基本操作&#xff0c;前四篇传送门&#xff1a;打算出一个 ElasticSearch 教程&#xff0c;谁赞成&#…