出题:要求实现层序遍历二元搜索树,并对比BFS与DFS的区别 分析:层序遍历也就是由上至下,从左到右的遍历每一层的节点,类似于BFS的策略,使用Queue可以实现,BFS不能用递归实现(由于每一层都需要存储所有节点,所以非常耗用内存).这段代码主要用于反映BFS与DFS的联系: 解题: class Node { public: int value; Node *left; Node *right; }; class MyStack { private: Node *array[]; int ca…
出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b  c d  e  f  g h  i  分析: 原始的层序遍历类似于BFS,打印当前访问的节点curNode的序列号,并将其直接子节点放入队列queue中,然后从queue中取出下一个节点,直 到队列为空:此方法仅能按照层序打印所有节点,并不能区分每一层节点的数量:如果需要区分当前层次的节点,和当前层次节点的子节点,可以使用两个队列 que…
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不用,node也能很好帮助我们完成!且笔试都支持用nodeJs,实际上就是用JS编程,只是用到了node的一些输入输出流方法. 我们看看最简单的使用模板:(转载) var readline = require('readline'); rl = readline.createInterface({ i…
广度优先搜索&深度优先搜索(Breadth First Search & Depth First Search) BFS优缺点: 同一层的所有节点都会加入队列,所以耗用大量空间: 仅能非递归实现: 相比DFS较快,空间换时间: 适合广度大的图: 空间复杂度:邻接矩阵O(N^2):邻接表O(N+E): 时间复杂度:O(V+E): DFS优缺点: 无论是系统栈还是用户栈保存的节点数都只是树的深度,所以空间耗用小: 有递归和非递归实现: 由于有大量栈操作(特别是递归实现时候的系统调用),执行速度…
这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示 顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10,5,6,7,8,13,18,17,16,11,12 假设 0的坐标为(0,0),1的坐标为(0,1),5的坐标为(1,0)其他以此类推. 题目是打印出来顺序的坐标. 当场这道题我没写出来,后来面试官让我回家写,然后发到他的邮箱.回到家网上找了一下,也没有好的解决方案,只好自己写了. 总体思路采用一…
树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集.关于树的基本概念不再作过多陈述,相信大家都有了解,如有遗忘,可翻书或去其他网页浏览以温习. 树中结点的最大层次数称为树的深度(Depth)或高度. 本文中以二叉树为例来讲述求树的深度的算法. 在算法开始之前,我们要有数据,即一棵树,树又是结点的集合.所以,应该先定义结点的数据结构(结点的基本属性和操作),然后再定义树的数据结构(树的基本属性和操作).本文的重点不是讲如何去创建树的数据结构,所以一切从…
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当使用数组存储这种数据结构时,在数组大小限制和堆大小限制下,如果当前节点下标为i,其父亲节点下标为i/2,左右孩子结点下标分别为 2i,2i+1(如果计算值没有超出队列大小范围): 使用堆有序完全二叉树(Complete Binary Tree)表示优先队列,所有操作即使最坏情况下的运行时间也只是对数…
议题:KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm) 分析: KMP算法用于在一个主串中找出特定的字符或者模式串.现在假设主串为长度n的数组T[1,n],模式串为长度m的数组P[1,m]:数组T和P满足:n>m,且所有元素都来自有限字母表中的字符: 常规比较方式是将模式字符串作为滑动窗口从左向右匹配主串的每一个位置,每到一个位置的时候都从当前的第一个字符开始比较,相同则比较下一个字符,否则移 到下一个位置.下左图中顶端字母行表示主串,模式…
出题:预先输入一个整型数组,数组中有正数也有负数:数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和:求所有子数组中和的最大值,要求时间复杂度O(n): 分析: 时间复杂度为线性表明只允许一遍扫描,当然如果最终的最大值为0表明所有元素都是负数,可以用线性时间O(N)查找最大的元素.具体算法策略请见代码和注释: 子数组的起始元素肯定是非负数,如果添加的元素为正数则记录最大和值并且继续添加:如果添加的元素为负数,则判断新的和是否大于0,如果小于0则以下一个元素作为起始元素重新开始,如果大于…
1.给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数 # coding:utf-8 ''' Created on 2015年8月11日 Q1: 给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数 @author: Hongzm ''' def judgeRepetNum(numArr): size = len(numArr) for…