遍历

LeetCode 无重复字符的最长子串

可紊 提交于 2020-01-08 08:28:17
为了在O(n)的时间复杂度内完成。需要一次遍历就得到结果 所以,我们在一次遍历的过程中检查当前不重复子串的长度,并更新最长子串的长度 为了记录当前遍历到的字符cur是否出现在不重复子串中,我们使用字典dic记录cur前一次上一次出现的位置: 1、如果dic的keys中没有cur则记录当前位置 2、如果有,则更新cur当前位置 使用start记录当前不重复子串的起始位置,初始为0 maxLen记录最长子串的长度,初始为0 过程是这样的:   从头遍历字符串,记录当前位置 i 的字符为cur。   1、如果cur没有包含在不重复子串中,记录cur的位置      dic[cur] = i   2、如果cur已经出现过      1)当前不重复字串中包含上一次出现的cur,即dic[cur] > start        将start移动到 i 之后,防止不重复子串中出现重复字符       2) 当前不重复子串中不包含上一次出现的cur,即dic[cur] < start ,不做任何操作    判断完成后,更新dic[cur] = i   检查当前不重复子串的长度是否大于maxLen,更新maxLen 1 class Solution(object): 2 def lengthOfLongestSubstring(self, s): 3 """ 4 :type s: str 5

数据结构之二叉树(C#版)

倖福魔咒の 提交于 2020-01-08 02:02:16
数据结构之二叉树(C#版) 什么是二叉树 人话版 猿话版 代码实现 树结构 树节点 二叉树的遍历方法 深度优先---Depth First Search(DFS) 先序遍历 中序遍历 后序遍历 深度优先遍历总结 广度优先---Breadth First Search(BFS) 总结 什么是二叉树 数据结构里面的“二叉树”这种结构,听起来很高大上,但实际上,他也的确是高大上,那么什么是二叉树呢? 下面我再次用灵魂给你画一下,什么是二叉树。 人话版 可以看到,最顶端那个小伙伴最拽,为什么呢?因为他是老大( 根节点 ),然后这位老大,左右手都提着一个小弟( 左右子树 ),并不是每个老大左右手都能提着小弟的哦,有可能只提一个,也有可能两手空空,然后他的小弟呢,也跟他一样(如果小弟比老大能提的小弟多,那老大可能就打死这个小弟了),可能提着两个小弟,可能提着一个小弟,也可能这个小弟也是两手空空,那么如此反反复复就构成了一个二叉树。 题外话 : 一开始我画上面的图的时候,我将没有提小弟的那只手,是给他们砍掉的,但后面发现不对,小伙伴还是要双手都有,但提不提小弟,就看他自己咯,这里其实是对应于 猿话版中的第二点 备注一下 : 图中红色的部分,其实在二叉树中并不存在,只是为了解释得更加生动,就把他画成比较像人(我也不敢说我画的是个人) 猿话版 1.首先二叉树是树; 2.二叉树每个元素都有只有两棵子树

干货!SQL性能优化,书写高质量SQL语句

回眸只為那壹抹淺笑 提交于 2020-01-07 20:40:48
写SQL语句的时候我们往往关注的是SQL的执行结果,但是是否真的关注了SQL的执行效率,是否注意了SQL的写法规范? 以下的干货分享是在实际开发过程中总结的,希望对大家有所帮助! 1. limit分页优化 当偏移量特别大时,limit效率会非常低。 SELECT id FROM A LIMIT 1000,10 很快 SELECT id FROM A LIMIT 90000,10 很慢 方案一: select id from A order by id limit 90000,10; 复制代码 如果我们结合order by使用。很快,0.04秒就OK。 因为使用了id主键做索引! 当然,是否能够使用索引还需要根据业务逻辑来定,这里只是为了提醒大家,在分页的时候还需谨慎使用! 方案二 select id from A order by id between 90000 and 90010; 复制代码 2.利用limit 1 、top 1 取得一行 有些业务逻辑进行查询操作时(特别是在根据某一字段DESC,取最大一笔).可以使用limit 1 或者 top 1 来终止[数据库索引]继续扫描整个表或索引。 反例 SELECT id FROM A LIKE 'abc%' 复制代码 正例 SELECT id FROM A LIKE 'abc%' limit 1 复制代码 3. 任何情况都不要用

码农找工作之:秒杀算法面试必须掌握的14种模式

ぃ、小莉子 提交于 2020-01-07 20:38:40
对于茫茫多的程序员来说,准备算法面试简直就是一个亚历山大的过程。看不完的学习资料,更惨的是,很多内容和程序员干的事情感觉相去甚远,这无疑只会雪上加霜。 这样的结果之一就是:程序员需要花上数周的时间在诸如LeetCode这样的在线编程平台上准备刷上几百个面试题目。这些焦虑的程序员都关心类似的问题: 我刷了足够的题了吗?我应该再来点吗? 这就是为啥我专注于帮助码农们掌握每个问题背后的模式的原因:这样的话,你们就不需要苦逼哈哈地担心着茫茫多的(一千多道)LeetCode的进度条了,也帮助你们避免盲目刷题的疲劳。如果你理解这些通用的模式,你就可以把他们当做是模板,去解决其他类似的被改头换面过的题目了。 这篇文章就和大家唠唠所有的面试题目可能的14种模式。当然更重要的,我会给大家讲讲怎么去识别每种模式,每个模式再给大家来几个样题尝尝鲜。当然,这些只是冰山一角啦,详细的,不用多说,墙裂推荐你去看这门课: Grokking the Coding Interview: Patterns for Coding Questions 该课程提供详细的理论讲解,例子和编程训练。 如果你需要买该网址的任何课程,都可以使用coupon code: awesome-developer-20 拿到额外八折。 接下来的这些模式是建立在你已经知晓了数据结构的基础之上的。如果你还没掌握的话,嘿嘿,推荐你去看:

Iterator

我与影子孤独终老i 提交于 2020-01-07 18:31:09
迭代对于我们搞Java的来说绝对不陌生。我们常常使用JDK提供的迭代接口进行Java集合的迭代。 Iterator iterator = list.iterator(); while(iterator.hasNext()){ String string = iterator.next(); //do something } 迭代其实我们可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类,它是一个很典型的设计模式。Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。 在没有迭代器时我们都是这么进行处理的。如下: 对于数组我们是使用下标来进行处理的: int[] arrays = new int[10]; for(int i = 0 ; i < arrays.length ; i++){ int a = arrays[i]; //do something } 对于ArrayList是这么处理的: List<String> list = new ArrayList<String>(); for(int i = 0 ; i < list.size() ; i++){ String string = list.get(i); //do something } 对于这两种方式

leetcode教程系列——Binary Tree

戏子无情 提交于 2020-01-07 16:01:51
  tree是一种常用的数据结构用来模拟真实物理世界里树的层级结构。每个tree有一个根(root)节点和指向其他节点的叶子(leaf)节点。从graph的角度看,tree也可以看作是有N个节点和N-1个边的有向无环图。   Binary tree是一个最典型的树结构。顾名思义,二分数的每个节点最多有两个children,分别叫左叶子节点与右叶子节点。下面的内容可以让你学习到: 理解tree的概念以及binary tree 熟悉不同的遍历方法 使用递归来解决二分树相关的问题 A. 遍历一棵树 Pre-order Traversal In-order Traversal Post-order Traversal Recursive or Iterative   1. Pre-order Traversal(前序遍历): 也就是先访问根节点,然后访问左叶子节点与右叶子节点   2. In-order Traversal(中序遍历):先访问左叶子节点,接着访问根节点,最后访问右叶子节点   3. Post-order Traversal (后序遍历):先访问左叶子节点,再访问右叶子节点,最后访问根节点 值得注意的是当你删除树的某一个节点时,删除流程应该是post-order(后序)的。也就是说删除一个节点前应该先删除左节点再删除右节点,最后再删除节点本身。 post

Java入门(三)——集合概讲

痴心易碎 提交于 2020-01-07 03:05:11
集合(或者叫容器)是Java的核心知识点,它有着很深的深度。我们这里不会设计多深,仅仅作为了解入门,深入了解请移步各种集合源码文章。好的,下面正是开始介绍... Java集合为何而生 我们知道,Java是一门面向对象编程语言,这也就意味着程序中存在着大量的对象。这个时候问题就来了,我们如何很好的存放和操作对象呢?如果你能明白这个问题,那么你就知道了“集合为何而生”这个问题的答案。 总结一句: Java给我们提供了工具(集合)方便我们去存放和操作多个Java对象 Java集合入门学习 Java集合的目的是方便操作多个对象,同时,它提供一系列的API来供我们操作。因此,在初学Java集合的时候我们更多的是 学习这些API的用法 。 对Java集合的API使用有一定了解之后,我们就应该从 面向对象 的角度去理解它。为什么会抽象出多个接口,以及每个接口有什么特征。 我们可以总结出几个常用的实现类,这几个常用的实现类我们必须知道它的数据结构是什么,什么时候使用这个类。 同时,你还需要学习和了解数据结构: 学完上面的内容后,我们基本掌握了常用集合的数据结构,也就知道了如何选择合适的集合容器去存储我们的对象。总之, 学完常见实现类的数据结构之后,对它们的使用场景也有了更加清晰的认识 。 Java集合类简介 Java集合是一个很庞大的知识点,话不多说,上图感受下: Java集合的

在数据库中存储层级结构

假装没事ソ 提交于 2020-01-06 23:37:05
(摘自: http://qinxuye.me/article/storing-hierachical-data-in-database/) 本文参考自 这篇文章 。文章是2003年的,但是现在来看仍然有着实际意义。 层级结构,也叫树形结构。在实际应用中,你经常需要保存层级结构到数据库中。比如说:你的网站上的目录。不过,除非使用类XML的数据库,通用的关系数据库很难做到这点。 对于树形数据的存储有很多种方案。主要的方法有两种:邻接表模型,以及修改过的前序遍历算法。本文将会讨论这两种方法的实现。这里的例子沿用参考文章中的例子,原文使用的PHP,这里将会用Java替代(本例使用Mysql数据库,Java连接Mysql的方法见本文末“备注一”)。 文中使用虚拟的在线食品商店作例子。这个食品商店通过类别、颜色以及种类来来组织它的食品。如图所示: 1)首先是邻接表模型 邻接表相当简单。只需要写一个递归函数来遍历这个树。我们的食品商店的例子用邻接表模型存储时看起来就像是这样: 通过邻接表模型存储法中,我们可以看到Pear,它的父节点是Green,而Green的父节点又是Fruit,以此类推。而根节点是没有父节点的。这里为了方便观看,parent字段使用的字符串,实际应用中只要使用每个节点的ID即可。 现在已经在数据库中插入完毕数据,接下来开始先显示这棵树。 打印这棵树:

五、树和二叉树

坚强是说给别人听的谎言 提交于 2020-01-06 22:06:51
(待完善) 基本概念: 树 二叉树 完全二叉树 满二叉树 完美二叉树 树的遍历 (二维的树转变为一维的线性表) 遍历的应用   查找树的叶子节点   求树高度(深度)   运算表达示树   利用遍历序列确定树 二插搜索树   搜索树的查找   搜索树的插入   搜索树的删除 来源: https://www.cnblogs.com/makelin/p/12146288.html

在Java8的foreach()中使用return/break/continue,不会跳出循环

烈酒焚心 提交于 2020-01-06 20:38:58
今天使用lambda表达式处理集合时,发现对return、break以及continue的使用有点迷惑,于是自己动手测试了一下,才发现在使用foreach()处理集合时不能使用break和continue这两个方法,也就是说不能按照普通的for循环遍历集合时那样根据条件来中止遍历,而如果要实现在普通for循环中的效果时,可以使用return来达到,也就是说如果你在一个方法的lambda表达式中使用return时,这个方法是不会返回的,而只是执行下一次遍历,看如下的测试代码: [java] view plain copy List<String> list = Arrays.asList( "123", "45634", "7892", "abch", "sdfhrthj", "mvkd"); list.stream().forEach(e ->{ if(e.length() >= 5){ return; } System.out.println(e); }); 上述代码的输出结果是如下图所示: 可以看出return起到的作用和continue是相同的。 想知道这是为什么,在 Stack Overflow 中找到一个答案,主要是说foreach()不是一个循环,不是设计为可以用break以及continue来中止的操作。 -------------------------------