最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间。惊喜的是,里面的所有源代码都是用java语言写的。

  接下来的一段时间里,我会将里面的大部分内容翻译成中文,再加上一些小y自己的解法和扩展内容,以博客的形式发在博客园。我想,这会是一件非常有趣的事情。

  以下是翻译的前言部分,第1、4题以及其解析部分。


前言:

  嗨,各位刷LeetCode的小伙伴们。

  就像你们看到这本书的书名,这是一本教人如何在面对面试题时写出简洁代码的指导手册。  

  你将会学习到如何写出优雅的代码,帮助你顺利地通过各种各样的技术面试。这本电子书将会在你上LeetCode刷题时带来最好的帮助。

  本书中,每一道题目都会有一个“Code it now”的链接。点击这个链接,将会打开OJ题目的页面。用户可以在这个OJ系统上提交自己的代码,并且即时得到反馈,知道给出的答案正确与否。如果在点击“Code it now”之后看到“Coming soon”的提示,那就是这个问题将会在不久的将来被添加进来,敬请期待。

  每道题都会注明难度和出现频率。有三种难度等级:简单(Easy),中等(Medium),困难(Hard)。简单难度的题目是那些很容易想到思路,而且实现起来也相当直接的问题。大多数面试中会遇到的问题都是这种类型的。

  另一方面,困难难度的题目大多数是算法类型的,需要你在动手写代码之前有更多的思考。LeetCode上有一些这类型的题目,但并不多。

  另外,还有三种出现频率的等级:低,中等,高。这里的频率指的是在面试中会遇到此问题或类似问题的频繁程度,数据来源于用户调查:“你是否曾经在一次面试中遇到过这道题目?”通过频率,我们可以大概知道有多大可能会在面试中遇到同样或类似的题目。

  每一道题目都可能会有“你在面试的时候可以这样问”(Example Questions Candidate Might Ask),举例说明你在遇到这道时应该问面试官些什么。弄清楚问题的限制条件是非常重要的,而且这是一个很好的缕清思路的过程。

  每一个问题都会有数不清的解决思路。每一个解决思路都会有一个时间复杂度和空间复杂度,这是两个你在选择哪一个思路时应该考虑的关键因素。在真正开始构建解决方案时,你应该首先分析的是跑这个程序要花多长的时间,和要占用多少的内存空间。在技术面试当中,分析时间复杂度和空间复杂度是非常常见的,每一个面试者都应该好好准备。

  独立解决一个问题是最好的学习途径。如果你被某一个地方卡住了,本书的提示能为你提供一些小TIPS,帮助你打开思路。如果你看完提示之后还是一筹莫展,那就翻到分析部分并且试着在LeetCode OJ上敲出自己实现的代码。

  即便你觉得某一道题很简单,但是写出正确而且整洁的代码并不是像很多人想象的那样简单。举个例子,如果你在某次面试当中为了解一道题写了超过30行的代码,那么很可能是不够简洁的。本书中给出的大部分参考范例代码行数都在20行到30行之间。

第一章:数组和字符串

第1题 两数加和(Tow Sum

Code it now! https://leetcode.com/problems/two-sum/

难度:简单 频率:高

问题描述:
  一个整数数组,找出某两个数加和等于某一个特定的数(target)。

  要求函数twoSum返回符合要求的两数在数组中所处的位置,index1和index2(index1必须小于index2)。请注意,你所编写的函数返回值应该是下标加1.(本题只需要考虑仅有唯一解的情况)。

解题方法:
  O(n2)的时间复杂度,常数空间复杂度-暴力算法(Brute force)
  暴力算法思路非常简单,遍历数组中每个元素x并且试图找到是否有另外一个值相加和等于目标数,即target - x。因为每一次匹配值都需要遍历一次数组剩余元素,所以时间复杂度是n平方。(译者注:原作并未提供暴力算法的代码,以下是我的解法)

  

  O(n)的时间复杂度,n的空间复杂度-哈希表(Hash table)
  通过将数组的值和索引使用哈希表存储起来,我们可以把匹配值的时间复杂度降为1。

(译者注:LeetCode还会在用户提交答案AC之后提供其解法与其他用户解法的量化对比数据)

暴力算法的性能——57ms

哈希表的性能——6ms

第四题 回文(Valid Palindrome)

Code it now! https://leetcode.com/problems/valid-palindrome/

难度:容易 频率:中等

问题描述:
  给出一个字符串,判断其是否一个回文字符串,只考虑字母和数字,而且忽略大小写。
  例如,“A man, a plan, a canal: Panama” 是一个回文字符串,而“race a car”不是一个回文字符串。

  面试者可以会问这样的问题:
  问:空字符串算是回文字符串吗?
  答:在这个问题里,我们将空字符串运定义为回文字符串。

解答方法:
  O(n)时间复杂度,常数空间复杂度
  思路非常简单,有两个“指针”——一个为“头指针”,另一个是“尾指针”。两“指针”相向移动直到移动,跳过所有非字母或非数字的字符。

  如果一个字符串只有非字母和非数字的字符,也是回文字符串,因为空字符串也是回文字符串。

算法性能——9ms


译者的话:

  学了算法到底有没有用?

  以前我觉得没什么用,工作很长一段时间都没有用上。后来刷了LeetCode,在老大交给我的几个任务里都用到了一些,例如这一章译文中提到的哈希表,直接把某个数据筛选环节的运行时间从原来的半个小时缩短到10秒,速度足足提升了将近两百倍。

  算法并不是没有用,而是如果一个程序员不懂算法,在实际的编程中他就想不到用哪个算法比较好,只会一味用暴力算法或者是API自带的函数。我惊喜地发现,如果你开始懂一点算法,知道在什么情景下适用,将会带来超乎想象的好处。

   另一方面,也不要把算法想得那么高深和艰涩,大部分实用的算法都只是20行左右的代码就能实现。

  只要你能鼓起勇气,克服因为未知而产生的恐惧,花一点时间和耐心去学习,将会看到一个完全不一样的世界。

(转发随意,转载请注明作者与博客园原地址)

(我的个人微信公众号:scut_xiaoy,搜索ID或扫描下方二维码添加关注,关注程序员自身成长和互联网时代下的新变化)

刷LeetCode的正确姿势——第1、125题的更多相关文章

  1. 用 JavaScript 刷 LeetCode 的正确姿势【进阶】

    之前写了篇文章 用JavaScript刷LeetCode的正确姿势,简单总结一些用 JavaScript 刷力扣的基本调试技巧.最近又刷了点题,总结了些数据结构和算法,希望能对各为 JSer 刷题提供 ...

  2. GitHub 热点速览 Vol.18:刷 LeetCode 的正确姿势

    作者:HelloGitHub-小鱼干 摘要:找对路子,事半功倍,正如本周 GitHub Trending #刷 LeetCode# 主题想表达的那般,正确的学习姿势方能让人走得更远,走进大厂

  3. 用JavaScript刷LeetCode的正确姿势

    虽然很多人都觉得前端算法弱,但其实 JavaScript 也可以刷题啊!最近两个月断断续续刷完了 leetcode 前 200 的 middle + hard ,总结了一些刷题常用的模板代码.走过路过 ...

  4. 刷LeetCode的简易姿势

    近期抽空刷了刷LeetCode,算是补补课. 由于不是很习惯直接在网页上Coding&Debug,所以还是在本地环境下进行编码调试,觉得基本OK后再在网页上提交. 主要采用Python3进行提 ...

  5. 用golang刷LeetCode

    用golang刷LeetCode 用Go语言刷LeetCode记录,只是为了练习Go语言,能力有限不保证都是最优解,只能在此抛转引玉了. 数据结构和算法 数据结构和算法是程序员的命根子,没了命根子也就 ...

  6. 刷leetcode是什么样的体验?【转】

    转自:https://www.zhihu.com/question/32322023 刷leetcode是什么样的体验? https://leetcode.com/ 1 条评论   默认排序 按时间排 ...

  7. 判断是否为gif/png图片的正确姿势

    判断是否为gif/png图片的正确姿势 1.在能取到图片后缀的前提下 1 2 3 4 5 6 7 8 9 //假设这是一个网络获取的URL NSString *path = @"http:/ ...

  8. 在Linux(ubuntu server)上面安装NodeJS的正确姿势

    上一篇文章,我介绍了 在Windows中安装NodeJS的正确姿势,这一篇,我们继续来看一下在Linux上面安装和配置NodeJS. 为了保持一致,这里也列举三个方法 第一个方法:通过官网下载安装 h ...

  9. 初刷LeetCode的感受

    自从上个月进入实验室的云安全项目组后,因为要接触到实际的代码,在实验室博士的建议下我们项目组的硕士开始刷LeetCode练习编程能力,保持每周抽空刷几道算法题.虽然刷的不多,到现在一共只刷了不到30题 ...

随机推荐

  1. 你必须知道的EF知识和经验

    注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式. 推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的 ...

  2. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  3. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  4. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

  5. JavaScript之职责链模式

    一.概述 职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有 ...

  6. AFNetworking 3.0 源码解读(六)之 AFHTTPSessionManager

    AFHTTPSessionManager相对来说比较好理解,代码也比较短.但却是我们平时可能使用最多的类. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilit ...

  7. Java 为值传递而不是引用传递

    ——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...

  8. 代码的坏味道(18)——依恋情结(Feature Envy)

    坏味道--依恋情结(Feature Envy) 特征 一个函数访问其它对象的数据比访问自己的数据更多. 问题原因 这种气味可能发生在字段移动到数据类之后.如果是这种情况,你可能想将数据类的操作移动到这 ...

  9. Android Studio-—使用OpenCV的配置方法和demo以及开发过程中遇到的问题解决

    前提: 1.安装Android Studio(过程略) 2.官网下载OpenCV for Android 网址:http:opencv.org/downloads.html 我下载的是下图的版本 3. ...

  10. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...