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的更多相关文章

  1. ARTS 1.14 - 1.18

    期望: 每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! Algorithm: 学习算法 Two Sum IV - In ...

  2. ARTS 12.10 - 12.14

    从陈皓博主的专栏里学到一个概念,争取可以坚持下去: 我在我的读者群中推荐出 ARTS 的任务,每个人每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Sha ...

  3. 【ARTS】01_08_左耳听风-20181231~20190106

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  4. 【ARTS】01_22_左耳听风-201900408~2019004014

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  5. ARTS Week 6

    Dec 2, 2019 ~ Dec 8, 2019 Algorithm 从本周开始,由于要涉及某一算法,但我又有选择困难症.所以我决定在Leetcode刷题的,用ARTS中的算法部分来记录本周值得记录 ...

  6. 剖析虚幻渲染体系(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. ...

  7. Ubuntu 14.04中Elasticsearch集群配置

    Ubuntu 14.04中Elasticsearch集群配置 前言:本文可用于elasticsearch集群搭建参考.细分为elasticsearch.yml配置和系统配置 达到的目的:各台机器配置成 ...

  8. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  9. Angular2 Hello World 之 2.0.0-beta.14

    公司现在采用angualrjs开发一些web应用,采用的是angular1,现在angular2已经差不多了,听说最近rc6已经出来了……其实感觉好慢啊!之前也做过一些anglar2的例子,但是没有记 ...

随机推荐

  1. owa部署

    新建一台win server 2012(注意如果是2008要补丁) 配置静态ip DNS指向ad域的ip 测试: ping 下ad域的域名,是通的继续 把本机加入到ad域 重启下 用admin登陆: ...

  2. 12款好用的Visual Studio插件,最后一款良心推荐

    目录 01 CodeMaid 02 Markdown Editor 03 ReSharper 04 GitHub Extension for Visual Studio 05 ZenCoding 06 ...

  3. 看完这篇HTTP,跟面试官扯皮就没问题了

    我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟.醍醐灌顶的感觉. 最初在有 ...

  4. 变量键盘读取、数组与宣告:read,array,declare

    1.read 2.declare/typeset 宣告变量的类型 3.数组(array)变量类型 4.与文件系统及程序的限制关系:ulimit 限制用户的某些系统资源,包括,可以开启的文件的数量,可以 ...

  5. Netty快速入门(01)Linux I/O模型介绍

    Netty简述 Netty是一个高性能的网络编程框架. 上面提到了几个关键的字眼,高性能,网络编程,框架.这些概括Netty的本质. Netty是一个NIO客户端服务器框架,可以快速轻松地开发协议服务 ...

  6. 【转】Zookeeper原理

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其 ...

  7. mysql的简单命令

    MySQL的命令介绍:   连接数据库服务器命令: mysql -u 用户名 -p 密码   mysql是连接MySQL数据库的命令 -u表示后跟用户名 -p 后跟密码   如果登录后展示 " ...

  8. C语言之函数用法总结

    C语言函数概述: 构成C语言程序的基本模块,模块化编程的最小单位. 函数调用的基本方式: 函数调用时的数据传递: 函数调用的过程: 函数原型与函数定义的区别: 函数封装: 1.外界对函数的影响仅限于入 ...

  9. 《C# 爬虫 破境之道》:第一境 爬虫原理 — 第四节:同步与异步请求方式

    前两节,我们对WebRequest和WebResponse这两个类做了介绍,但两者还相对独立.本节,我们来说说如何将两者结合起来,方式有哪些,有什么不同. 1.4.1 说结合,无非就是我们如何发送一个 ...

  10. <a>标签的href和onclick属性【转】

    1链接的onclick 事件被先执行,其次是href属性下的动作(页面跳转,或 javascript 伪链接): 2假设链接中同时存在href 与onclick,如果想让href 属性下的动作不执行, ...