ARTS Week 14
Jan 27, 2020 ~ Feb 2, 2020
Algorithm
Problem 160.Intersection of Two Linked Lists(相交链表) 题目链接
题目描述:给定两个链表,判断其是否存在相交,若存在则返回相交节点,若不存在则返回 null。假设链表中不存在环路,函数不能破坏链表原有结构。举例,下面的两个链表则为相交链表,相交结点为 9。
1 -> 2 -> 3
\
9 -> 8
/
7
思路1:与上一周的题目类似,可以将其中一个链表中所有结点的地址用一个集合进行保存,接下来便利另一个链表,若其中出现某个结点地址也出现在了集合中,那么说明两个链表相交,若遍历结束也没有出现,则说明两个链表不相交
通过的代码如下
# Solution 1
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
if (headA == None) or (headB == None):
return None
node_id_A = set([])
p = headA
while p != None:
node_id_A.add(id(p))
p = p.next
q = headB
while q != None:
if id(q) in node_id_A:
return ListNode(q.val)
q = q.next
return None
思路2:使用两个指针进行判断。先进行遍历,若两个链表的末尾元素不相同,则说明两个链表必定不相交(注:若相交则末尾元素相同,但是末尾元素相同未必相交!)。假设两个链表相交,那么该如何找到相交元素呢?设两个链表分别为A , B,相交部分为 C,两个指针 p,q 分别先指向 A,B,当遍历链表到末尾时,让 p 指向B,q 指向 A,继续遍历,当 p,q相等时,则说明该节点为开始相交的节点,原因很简单,因为在找到相交的节点时,p 遍历了 len(A) + (len(B) - len(C)) 个元素,q遍历了 len(B) + (len(A) - len(C)) 个元素,二者是相等的。故因此可以找到相交节点。
通过的代码如下
# Solution 2
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
if (headA == None) or (headB == None):
return None
p = headA
q = headB
while p.next != None:
p = p.next
while q.next != None:
q = q.next
if p.val != q.val:
return None
else:
p = headA
q = headB
while p != q:
if p.next == None and q.next != None:
p = headB
q = q.next
elif q.next == None and p.next != None:
q = headA
p = p.next
else:
p = p.next
q = q.next
if p == None:
return None
else:
return ListNode(p.val)
Review
本周继续 Review 每个程序员需要知道的97件事(英文名:97 Things Every Programmer Should Know)。原文链接。下面是本周的5个小内容:
- 大师神话(The Guru Myth) 原文链接
在软件行业有许多闻名的大师,但事实上,“大师”也是人类,他们思考问题时的逻辑方法很我们没什么太多区别。只不过因为经验等积累的较多,“大师”可以利用思维捷径和直觉来发现和解决问题。当然,天赋资质方面仍存在差异,但对大多数人来说,这一点并不明显。 - 努力工作没有回报(Hard Work Does not Pay Off) 原文链接
由于编程和软件开发涉及一个连续的学习过程,你始终需要去学习新的知识。比如阅读书籍,参加会议,与其他专业人员交流,尝试新的技术,简化现有工具等。如果你在项目上花费的时间太多了,既无法保证项目的质量,也无法提升自己。 - 使用 bug 追踪器(How to Use a Bug Tracker) 原文链接
一个好的 bug 报告需要三件事:1)如何尽可能的重现该错误,以及指出该错误发生的频率;2)正常运行应该发生/进行什么操作;3)实际上发生了什么。bug 追踪器除了 bug 报告以外,仍需要记录发现者,bug紧急程度,修复 bug 的人,是否完成修复等。 - 通过删除代码来改进代码(Improve Code by Removing It) 原文链接
少即是多,任何项目中有许多不必要的代码,我们可以通过删除这些代码已达到改进的目的。不必要的代码一办出现在哪里呢?最常见的地方便是“无用”的功能,项目中有一些功能,虽然设计时觉得很有用,但实际情况是很少有用户使用,因此这些功能涉及到的代码便可以去除。当然,还有很多冗余的代码分布在算法设计,数据结构的设计等 - 安装程序(Install Me) 原文链接
任何软件都应该编写一份安装说明。对于有GUI的软件,安装过程一般不是很复杂。但对于没有GUI的软件,例如某工具、库等,你应该为其写一个文档来告诉使用者如何安装/使用它。
此外,分享一篇我在 Linux 中国翻译的文章:查看 Linux 系统中进程和用户的内存使用情况
Tips
JavaScript 中 NaN 这个特殊的Number与所有其他值都不相等,包括它自己。唯一能判断NaN的方法是通过isNaN()函数:
NaN === NaN; // false
isNaN(NaN); // true
Sharing
我本周试着参与了一下上周提及的 Linux 中国翻译计划,发现参加起来还是比较容易的,可供选择的题目也不少,每天也有新的题目入选,维护者也比较积极,每天都会处理新的PR。普通人的参与方式是作为译者,想将自己准备翻译的英文文章中一些信息进行修改并提交PR,等翻译好更新文章内容,再次提交新的PR,总结一下,就是翻译一篇文章共需要提交两个PR。等翻译的文章经过校对以后,便会公开发布。在 Review 部分中,我分享了我自己翻译的第一篇文章。
ARTS Week 14的更多相关文章
- ARTS 1.14 - 1.18
期望: 每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! Algorithm: 学习算法 Two Sum IV - In ...
- ARTS 12.10 - 12.14
从陈皓博主的专栏里学到一个概念,争取可以坚持下去: 我在我的读者群中推荐出 ARTS 的任务,每个人每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Sha ...
- 【ARTS】01_08_左耳听风-20181231~20190106
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- 【ARTS】01_22_左耳听风-201900408~2019004014
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- ARTS Week 6
Dec 2, 2019 ~ Dec 8, 2019 Algorithm 从本周开始,由于要涉及某一算法,但我又有选择困难症.所以我决定在Leetcode刷题的,用ARTS中的算法部分来记录本周值得记录 ...
- 剖析虚幻渲染体系(14)- 延展篇:现代渲染引擎演变史Part 1(萌芽期)
目录 14.1 本篇概述 14.1.1 游戏引擎简介 14.1.2 游戏引擎模块 14.1.3 游戏引擎列表 14.1.3.1 Unreal Engine 14.1.3.2 Unity 14.1.3. ...
- Ubuntu 14.04中Elasticsearch集群配置
Ubuntu 14.04中Elasticsearch集群配置 前言:本文可用于elasticsearch集群搭建参考.细分为elasticsearch.yml配置和系统配置 达到的目的:各台机器配置成 ...
- IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)
首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...
- Angular2 Hello World 之 2.0.0-beta.14
公司现在采用angualrjs开发一些web应用,采用的是angular1,现在angular2已经差不多了,听说最近rc6已经出来了……其实感觉好慢啊!之前也做过一些anglar2的例子,但是没有记 ...
随机推荐
- Python for Data Analysis 学习心得(三) - 文件读写和数据预处理
一.Pandas文件读写 pandas很核心的一个功能就是数据读取.导入,pandas支援大部分主流的数据储存格式,并在导入的时候可以做筛选.预处理.在读取数据时的选项有超过50个参数,可见panda ...
- PPP协议 PAP认证
- 量化投资学习笔记07——python知识补漏
看<量化投资:以python为工具>这本书,第一部分是python的基础知识.这一部分略读了,只看我还不知道或不熟的. 定义复数 x = complex(2, 5) #2+5j 也可以直接 ...
- (01)hibernate框架环境搭建及测试
---恢复内容开始--- 1.创建javaweb项目 2.导包 hibernate包 hibernate\lib\required\*.jar 数据库驱动包 mysql-connector-java- ...
- springboot多环境(dev,test,prod)配置
前情提要 在我们开发工作中,常常因为配置的问题,搞得头昏脑大.开发环境.测试环境.配置各不相同,数据库.redis.注册中心等等参数都不一致,如果放在同一个配置文件,就会发现诸多注释,发布不同的环境, ...
- Java并发-几种常见的锁
这几天在忙着投提前批内推,前面看的好多东西没有总结,正好这两天补上顺带复习一下 synchronized:Java之重型锁
- .NET 在云原生时代的蜕变,让我在云时代脱颖而出
.NET 生态系统是一个不断变化的生态圈,我相信它正在朝着一个伟大的方向发展.有了开源和跨平台这两个关键优先事项,我们就可以放心了.云原生对应用运行时的不同需求,说明一个.NET Core 在云原生时 ...
- 弹性碰撞 poj 3684
Simon is doing a physics experiment with N identical balls with the same radius of R centimeters. Be ...
- scope为provided
以下面dependency为例 1 <dependency> 2 <groupId>javax.servlet</groupId> 3 <artifactId ...
- 若依框架. 仿ThymeLeaf前端SelectDictLable方法
在framework项目下新增所需服务