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的例子,但是没有记 ...
随机推荐
- Winform PPT切换图片效果
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- asp.net core 3.x 通用主机是如何承载asp.net core的-上
一.前言 上一篇<asp.net core 3.x 通用主机原理及使用>扯了下3.x中的通用主机,刚好有哥们写了篇<.NET Core 3.1和WorkerServices构建Win ...
- 【转】推荐给初级Java程序员的3本进阶书
ImportNew 注: 原作者在这篇文章中介绍3本不错的技术书籍.作者认为这些书籍对新手或者学生而言尤其有帮助.通过一些基础性的教程入门后,我们可以使用Java做基础性的编程.然而,当我们需要从初级 ...
- JSON小记
json: { "1" : "2", "1" : "3" } 在json中如果有重复的key,会取最后一个key的值,如 ...
- ip转十进制(PHP、MySQL)
mysql与php中都提供了IP转换十进制数函数 1. IP 由点分格式,转换为数字格式,代码如下: mysql> select inet_aton('127.0.0.1'); +------- ...
- VMware Workstation CentOS7 Linux 学习之路(5)--Docker安装与使用
一.安装与配置 1.安装依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2.设置阿里云镜像源 sudo yum ...
- 使用远程接口库进一步扩展Robot Framework的测试能力
引言: Robot Framework的四层结构已经极大的提高了它的扩展性.我们可以使用它丰富的扩展库来完成大部分测试工作.可是碰到下面两种情况,仅靠四层结构就不好使了: 1.有些复杂的测试可能跨越多 ...
- MOS 常用链接地址
主页面类 Exadata主页面 Exadata Database Machine and Exadata Storage Server Supported Versions (Doc ID 8888 ...
- Java入门 - 语言基础 - 02.开发环境配置
原文地址:http://www.work100.net/training/java-environment-setup.html 更多教程:光束云 - 免费课程 开发环境配置 序号 文内章节 视频 1 ...
- MySql主要性能指标说明
在项目当中数据库一般都会成为主要的性能与负载瓶颈,那么针对数据库各项性能指标的监控与对应的优化是开发与运维人员需要面对的主要工作,而且这部分的工作会贯穿项目从开发到运行的整个周期里. 这篇文章中我们对 ...