背景

如果前人认为这个一种学习提高或者检验能力的成功实践。而自己目前又没有更好的方法,那就不妨试一试。

而不管作为面试官还是被面试者,编码题最近越来越流行。而两种角色都需要思考的问题是希望考察什么能力,通过什么题目,需要达到怎样的程度可以说明面试者具有了这样的能力。

而要找到上面这些问题的答案,比较好的方式除了看一些理论性文章和接受培训之外,自己动手刷一刷leetcode切身实践一下不失为一个不错的方式。而既然要花精力去做这件事情,那就需要解决一个问题:我从中可以获得什么提高。以下是个人的一些经验和感受。

收益

对底层有了更深入的了解和思考

leetcode一些常见题也是平时工作中常用的一些底层数据结构的实现方法。

先举个大家使用比较多的算法:LRU(最近最少使用),在Java的实现中实现特别简单。只是使用了LinkedHashMap这种数据结构。而如果看一些开源包里LRU的实现,发现也是这样实现的。实际上动手实现一遍,LRU就再也不会忘了。

再举个数据结构的例子:字典树又叫前缀树。它是搜索和推荐的基础。标准点的定义是:

字典树又称单词查找树,Tire树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

因为之前做过搜索引擎,一直也对这块很有兴趣,所以对它底层知识的补充对个人而言,感觉深度有增加。

养成评估时空开销的习惯

我刷leetcode必看官方解答里估算的时间和空间复杂度。这也是作为一个架构师的必备基本能力。

数组、哈希这些因为数据的位置不需要进行查找,只需要算数计算就可以得到,所以它们的时间复杂度是O(1)。

链表如果直接在头部或者尾部插入,因为不需要查找,所以时间复杂度也是O(1),但是定位的话因为涉及查找,按遍历查找来算是log(n)。所以对于jdk1.7之前,hashmap底层采用的是数组+链表的数据结构。所以如果不算哈希冲突和扩容的话,获取和插入数据的时间复杂度是O(1);如果出现了哈希冲突,则插入因为是头部插入,时间复杂度还是O(1);获取时间复杂度因为涉及先查找,所以是O(n),这个n代表冲突的数量。

对于在有序数据中进行查找,因为可采用二分查找等优化,时间复杂度可降到log(n).

对于递归调用,如果递归方法内进行2次调用。对于层数n来说,时间复杂度是2的n次方。举个例子就是一个数等于前面两个数之和。当然,如果是前面3个数之和,不进行优化的情况下时间复杂度就是3的n次方。

对于一个n*m的二维数组等需要进行嵌套循环遍历的,时间复杂度是O(n*m),有个特殊情况是n*m,这时候时间复杂度是n的平方。

对于全排列的情况,时间复杂度是O(n!)。

代码简化的方法

我习惯的一种学习方法是先做题,有了一定自己的总结和思考之后,再看书学习别人的总结思考方法。对于刷leetcode相关性高,也比较受认可的书是《Cracking the Coding interview(6th)》,中文版翻译是《程序员面试金典》。这本书对于面试官和面试者来说读了都会有一定的收获。

我读了这本书,对我印象最深的是介绍了两种代码优化的方法:BUD和BCR。

BUD

BUD是瓶颈、不必要工作、重复工作 三个词组首字母的缩写。

作者提出拿到一道编程题,可先尝试用暴力解法将题目写出来,之后找到解法的性能瓶颈,针对瓶颈进行优化,之后在去掉不必要的工作,最后去掉重复的工作。

这个经典的编程优化方法不只可应用于编程,还可应用于整个程序的优化,也是最常规的优化方法。

BCR

BCR是Best Conceivable Runtime的缩写,意思是想知道自己可以优化到什么程度,先估算可达到的最优情况。

比如:在一个无序数组中,查找两个两个相同的数。直觉来说如果找到这两个数,最起码需要将每个数都遍历一遍,所以可达到的最优情况是O(n),无论怎么优化,都不可能比这个更好。所以这就是优化的上限。

这本书里还介绍了其他的优化方法如:使用额外数据结构、通过构建测试用例、根据题目的限制和提示来寻找线索,大家看这本书的时候可以了解下。

推荐一种通过刷leetcode来增强技术功底的方法的更多相关文章

  1. 工具推荐--刷LeetCode的神器

    本文首发于微信公众号:[坂本先生],文章地址为: https://mp.weixin.qq.com/s/vHv5hO8nils_g2VSKwu1Cg如有转载请标明出处 今天给大家安利一款快速刷Leet ...

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

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

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

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

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

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

  5. 用JavaScript刷LeetCode的正确姿势

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

  6. 用golang刷LeetCode

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

  7. 《通过刷leetcode学习Go语言》之(1):序言

    Author       : Email         : vip_13031075266@163.com Date          : 2021.03.07 Version     : 北京 C ...

  8. 刷LeetCode的正确姿势——第1、125题

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

  9. 初刷LeetCode的感受

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

随机推荐

  1. Rocket - devices - TLBusBypass

    https://mp.weixin.qq.com/s/WviVHxlZvsNm8mea2VpfTw 简单介绍TLBusBypass的实现. 1. TLBypassNode TLBypassNode定义 ...

  2. jchdl - GSL实例 - Div

    因为对除法研究不深,这里略去不表.   有兴趣可以参考链接: https://github.com/wjcdx/jchdl/blob/master/src/org/jchdl/model/gsl/op ...

  3. Java实现 LeetCode 398 随机数索引

    398. 随机数索引 给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引. 您可以假设给定的数字一定存在于数组中. 注意: 数组大小可能非常大. 使用太多额外空间的解决方案将不会通过测试 ...

  4. java实现第五届蓝桥杯猜字母

    猜字母 题目描述 把abcd-s共19个字母组成的序列重复拼接106次,得到长度为2014的串. 接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母. 得到的新串再进行删除 ...

  5. ASP.NET Core 3.1 WebApi部署到腾讯云CentOS 7+Docker

    一.准备 首先需要有一台CentOS服务器,安装最新版Docker,配置镜像加速等,安装方法网上很多,下面是一些相关指令: yum install -y yum-utils device-mapper ...

  6. PIP 更换国内安装源

    linux: 修改 ~/.pip/pip.conf (没有就创建一个), 内容如下: [global] index-url = https://pypi.tuna.tsinghua.edu.cn/si ...

  7. java.net.URISyntaxException 问题解决

    先上代码: Properties pro = PropertyUtil.getPropertiesInfo("xxx.properties"); String url = pro. ...

  8. java特性 JDK JRE JVM

    1简单性 2可移植性性(跨平台) 3面向对象 4高性能 5分布式 6动态性 7多线程 8安全性JDK:java开发工具 . JRE:JDK:java运行环境 . JVM:JDK:java虚拟机

  9. iostst

    原文链接:https://blog.csdn.net/qq_20332637/article/details/82146753 iostat用于输出CPU和磁盘I/O相关的统计信息,iostat 也有 ...

  10. mybatis 学习教程

    https://www.cnblogs.com/ashleyboy/category/1246107.html