
数据结构与算法
Cacra
编程路上在探索。
展开
-
再看JavaScript中的树的中序遍历的递归过程
参考文章:https://www.imooc.com/qadetail/236313<!--参考资料:https://www.imooc.com/learn/888https://github.com/qq326943819/Binary-Tree--><!DOCTYPE html><html lang="en"><head> ...原创 2019-08-31 14:25:09 · 311 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(15)合并两个排序的链表
1.题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。2.题目分析重点抓住这两个链表都是单挑递增的,因此我们只需要不断地比较他们的头结点就行,明显这是个重复的过程。可以用递归做,也可以不用递归做,不用递归做只需要用两个指针来一直指向两个链表的“头”结点就行了3.代码/* function ListNode(x){ this.val...原创 2019-06-21 15:08:49 · 192 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(14)反转链表
1.题目描述输入一个链表,反转链表后,输出链表的所有元素。2.思路next = head.next; // 1head.next = pre; // 2pre = head; // 3head = next; // 4第一行代码:next = head.next;将head.next赋值给next变量,也就是说next指向了节点2,先将节点2保存起来。第...原创 2019-06-21 14:34:56 · 319 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(13)链表中倒数第k个结点
1.题目描述输入一个链表,输出该链表中倒数第k个结点。2.思路题目:输入一个链表,输出该链表中倒数第k个节点。要求:为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个节点。例如:一个链表有6个节点,从头节点开始,他们的值依次是1、2、3、4、5、6.这个链表的倒数第三个节点是值为4的节点。通用思路:当我们用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针...原创 2019-06-21 09:36:00 · 163 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(12)调整数组顺序使奇数位于偶数前面
1.题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。2.思路1.新建两个数组,分别用来存放奇数和偶数;2.将偶数的数组连接到奇数数组后面。3.代码function reOrderArray(array){ var odd = []; va...原创 2019-06-21 09:07:02 · 128 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(3)从尾到头打印链表
参考文章:https://www.cnblogs.com/wuguanglin/p/printListFromTailToHead.html题目描述:输入一个链表,从尾到头打印链表每个节点的值。题目分析:比较简单,主要注意下从尾到头,可以用栈可以用递归,我给出我比较喜欢的代码吧代码:function ListNode(x){ this.val = x; this.next = nu...原创 2019-06-10 23:38:54 · 167 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(2)替换空格
题目描述:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。题目分析:我们如果要替换空格,两步:1先知道空格的位置,2替换,但是字符串中有多个空格,所以我们就要循环,替换完之后再去查找字符串空格位置当然你也可以选择用正则代码:function replaceSpace(str){ ...原创 2019-06-10 23:41:20 · 177 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(1)二维数组的查找
参考文章:https://www.cnblogs.com/wuguanglin/p/2dArrayFind.html题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。题目分析:题目不难,而且给出的限制也很小,我一开始试试用了暴力逐步循环发现也能通过,但是这题目设计的...原创 2019-06-10 23:18:11 · 166 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(11)数值的整数次方
1.题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。2.题目分析这道题用传统的方法也可以做,只不过效率太低,这里我们用到快速幂的方法。快速幂,原理如下:好了,此外再说一句,对1进行按位与,可以判断二进制数最右边的位数是否为1,因此也可以判断奇偶数,因为奇数最后一位一定为1。3.代码思路:1.考察指数的正负以及底数...原创 2019-06-20 10:19:09 · 168 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(10)二进制中1的个数
1.题目描述2.题目分析3.代码参考文章:https://www.cnblogs.com/wuguanglin/p/NumberOf1.htmlhttps://www.cnblogs.com/echovic/p/6430668.htmlhttps://github.com/DavidChen93/-offer-JS-/blob/master/15.1 二进制中1的个数.js...原创 2019-06-20 09:38:12 · 218 阅读 · 0 评论 -
算法题- 对多种类型数组进行去重
题目:原创 2019-05-29 14:59:07 · 453 阅读 · 0 评论 -
JavaScriptScript版《剑指Offer》刷题资源整理和JavaScript刷题总结
注意:资料来自网上,我会附上来源链接,我只是尝试总结下适合自己,方便自己查看1.JavaScript版《剑指Offer》刷题资源牛客/博客园(非常推荐):https://www.nowcoder.com/discuss/101711?type=5https://www.cnblogs.com/wuguanglin/p/code-interview.htmlhttps://www.cnbl...原创 2019-06-01 11:00:25 · 1163 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(16)树的子结构
1.题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)2.思路二叉树子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取。例如:由于A中有一部分子树的结构和B是一样的,因此B是A的子结构。思路:1.有关二叉树的算法问题,一般都可以通过递归来解决。那么写成一个正确的递归程序,首先一定要分析正确递归结束的条件。2.如果根节点...原创 2019-06-21 15:27:15 · 167 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(4)重建二叉树
参考文章:https://www.cnblogs.com/wuguanglin/p/reConstructBinaryTree.htmlhttps://wenhuiyang-luck.github.io/2017/07/24/《剑指offer》— JavaScript(4)重建二叉树/https://www.jianshu.com/p/ecf61a11f412https://blog.cs...原创 2019-06-12 10:38:24 · 141 阅读 · 0 评论 -
JavaScript字符串、数组和对象一些方法使用
1.delete方法//数组var a = [1,2,3,4,5,6]delete a[1]a[1,empty,2,3,4,5,6]//对象var b = {1:'1',2:'2',3:'3'}delete b[1]b{2:'2',3:'3'}2.字符串的length和索引(通过key)str = '01234'str.length => 5str[1]...原创 2019-08-27 09:18:23 · 282 阅读 · 0 评论 -
JavaScript最大公约数
//最大公约数求解(辗转相除法)function gcd(a, b) { if (a % b === 0) { return b; } return gcd(b, a % b);}console.log(gcd(28, 12));4参考文章:https://blog.youkuaiyun.com/u014291497/article/details/79...原创 2019-08-22 12:53:41 · 457 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(33)第一次只出现一次的字符
题目描述在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置。题目分析思路:1.新建一个对象,其中key用来存放字符,value用来存放该字符出现的次数;2.第一次循环,将所有字符和对应出现的次数存放在map中,时间复杂度为0(n);3.第二次循环找到value为1的字符所在的位置,并返回。代码function ...原创 2019-08-21 10:37:07 · 201 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(32)丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。题目分析按顺序将丑数保存在数组中,然后求下一个丑数;下一个丑数是由数组中某个丑数A * 2,B * 3,C * 5中的最小值得来的。按照题目规定,第一个丑数是1,存入数组中;第二个丑数为12,13,1...原创 2019-08-21 10:26:49 · 226 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(31)把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。题目分析思路:本题关键点是制定排序规则,设计比较器;排序规则如下:若ab > ba 则 a > b,若ab < ba 则 a < b,若ab = ba 则 a = b;例如:...原创 2019-08-21 10:12:05 · 220 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(30)从1到n整数中1出现的次数
题目描述输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。题目分析思路一:暴力求解,每次求1的个数思路二:设定整数点(如1、10、100等等)作为位置点i(对应n的各位、十位、百位等等),分别对每个数位上有多少包含1的点进行分析根据设定的整数位置,对n进行分割,分为两部分,高位n/i,低位n%i当i表示百位,且百位对应的数>=2,如n=31456,i=100,则a=...原创 2019-08-21 09:13:06 · 263 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(29)连续子数组的最大和
题目描述输入一个整型数组,数组里面有正数,也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。题目分析思路一:暴力枚举,一个一个子数组计算思路二:前面累加和加上当前值,其结果比当前值还小,说明前面的累加值还不如当前值开始,那么就重新计算子数组的起始位置,然后重复之前的步骤思路三:动态规划代码思路一代码:function sub...原创 2019-08-21 08:32:52 · 184 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(28)最小的K个数
1.题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。2.题目分析3.代码原创 2019-08-21 08:12:50 · 236 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(19)包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。题目分析我们把每次入栈,和之前栈内数据比较,把每次的最小元素都保存起来放到另外一个辅助栈里。代码/*题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。要求:在该栈中,调用min、push、pop的时间复杂度都是O(1)。*///用一个辅助空间,保存每次推入时的最小值情况...原创 2019-06-30 21:55:55 · 205 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(18)顺时针打印矩阵
1.题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.2.题目分析首先我们需要把这个复杂的问题分解为简单的问题,打印矩阵也就是一圈一圈的打印出来,所以我们需要解决的问题就是:...原创 2019-06-30 21:06:42 · 312 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(17)二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。相关知识二叉树的镜像定义:源二叉树镜像二叉树思路1.有关二叉树的算法问题,一般都可以通过递归来解决。那么写一个正确的递归程序,首先一定要分析正确递归结束的条件。2.先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子节点;3.当交换完所有的非叶子结点的左右子结点之后,就得到了树的镜像代码//1.第一种方...原创 2019-06-30 19:20:03 · 150 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(6) 旋转数组的最小数字
1.题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。2.题目分析第一种方法:我们发现旋转数组在旋转后,有个分界点,而这个分界点就是最小的那个数。第二种方法...原创 2019-06-12 14:11:10 · 184 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(5)用两个栈实现队列
1.题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。(也就是操作这两个“先进后出”的栈实现一个“先进先出”的队列)2.题目分析栈是先进后出,队列是先进先出,因此两个栈,一个用来push,一个用来pop,同时注意下两个栈不为空的时候。思路:入队:将元素进栈1;出队:判断栈2是否为空,如果为空,则将栈1中所有元素pop,并push进栈2,栈2出栈...原创 2019-06-12 11:50:15 · 162 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(9)矩形覆盖
1.题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?2.题目分析1.先上图: 2*1的大矩形和2*n的小矩形:2. 第一次覆盖有两种情况: 横着覆盖:竖着覆盖:3. 由此可得:当第一次横着覆盖时,覆盖方法为f(n-2),配合上图理解;当第一次竖着覆盖时,覆盖方法为f(n-1),配...原创 2019-06-12 19:25:41 · 174 阅读 · 0 评论 -
JavaScript数据结构与算法(10)树
前面介绍过一种非顺序数据结构是散列表,本文将详细介绍另一种非顺序数据结构——树,它对于存储需要快速查找的数据非常有用二叉树、满二叉树、完全二叉树、堆、二叉搜索树BST/二叉查找树/二叉排序树二叉搜索树是我们这章要研究的数据结构1.树-创建BinarySearchTree类function BinarySearchTree() { var Node = function(key){ //...原创 2019-05-29 10:08:04 · 149 阅读 · 0 评论 -
JavaScript数据结构与算法(4)栈和队列
1.原创 2019-03-28 16:01:53 · 185 阅读 · 0 评论 -
JavaScript数据结构与算法(1)数组常用方法
参考资料:《学习JavaScript数据结构与算法》1.创建和初始化数组new Array();new Array(7);new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[];['Sunday','Monday','Tuesday','Wednesday','Thursda...原创 2019-03-28 10:24:21 · 422 阅读 · 0 评论 -
树的存储结构
双亲表示法:注:其中r=0表示的是根,n=11表示是11个结点。然后parent的数字指向是0-10的下标。这样的存储结构,我们可以根据某结点的parent指针找到它的双亲结点,所用的时间复杂度是O(1),索引到parent的值为-1时,表示找到了树结点的跟。 因此可是,如果我们要知道某结点的孩子是什么?那么不好意思,请遍历整个树结构。 我们可以稍微改变下结构:那么我们现在...原创 2018-02-26 13:54:09 · 605 阅读 · 0 评论 -
树、森林和二叉树
普通树转换为二叉树:1.树到二叉树的转换 步骤:(1)在树中所有的兄弟结点之间加一条线 (2)对每个结点,除了保留与其长子的连线外,去掉该结点与其他孩子的连线 深绿色就是第一步。 然后调整位置: 森林到二叉树的转换: (1)先将森林中的每棵树变为二叉树。 (2)再将各二叉树的根结点视为兄弟,从左到右连在一起,就形成了一棵二叉树。 然后再去掉结点与孩子结点的连线,...原创 2018-02-26 13:53:13 · 877 阅读 · 0 评论 -
查找算法
静态查找和动态查找静态查找:数据集合稳定,不需要添加,删除元素的查找操作。 动态查找:数据集合在查找的过程中需要同时添加或删除元素的查找操作。对于静态查找来说,我们不妨可以用线性表结构组织数据,这样可以使用顺序查找算法,如果我们再对关键字进行排序,则可以使用折半查找算法或裴波那契查找算法来提高查找的效率。对于动态查找来说,我们则可以考虑使用二叉排序树的查找技术,另外我们还可以使用散列...原创 2018-02-26 13:51:57 · 216 阅读 · 0 评论 -
排序算法
冒泡排序: 即:使得序列成为一个按关键字有序排列的序列。排序的稳定性: 影响排序算法性能的几个要素: 1.时间性能(主要操作:比较和移动) 2.辅助空间(偏小较好) 3.算法的复杂性(算法本身的复杂度)冒泡算法: 基本思想:两两相邻记录的关键字,如果反序则交互,直到没有反序的记录为止。 冒泡排序的要点: 1.两两注意是相邻的两个元素的意思 2.如果有n个元素需要比...原创 2018-02-26 13:50:39 · 164 阅读 · 0 评论 -
链表
静态链表:用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法。(游标指向下标)我们对数组的第一个和最后一个元素做特殊处理,他们的data不存放数据。我们通常把未使用的数组元素称为备用链表。数组的第一个元素,即下标为0的那个元素的cur就存放备用链表的第一个结点的下标。数组的第一个元素,即下标为MAXSIZE-1的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点作用...原创 2018-02-26 13:48:41 · 170 阅读 · 0 评论 -
数据结构—头指针和头结点分析
头指针和头结点头指针:是指向链表中第一个结点(或为头结点或为首元结点)的指针。 单链表可由一个头指针唯一确定。头结点:是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息;设置头结点的最大好处就是方便处理空表。首元结点:是指链表中存储线性表第一个数据元素a1的结点。原网址: http://www.zybang.com/question/832caa4...原创 2018-02-26 13:47:57 · 1230 阅读 · 0 评论 -
JavaScript数据结构与算法(3)集合
主要参考:https://www.cnblogs.com/xiaohuochai/p/8176248.html《学习JavaScript数据结构与算法》1.集合介绍一个集合示例:{1,2,3,4,5}其实集合set内部是键值对方式:集合这种键值对方式和字典很相似,集合是以[值,值]的形式存储元素,字典则是以[键,值]的形式来存储元素。2.创建集合声明一些集合可用的方法:ad...原创 2019-05-19 09:40:22 · 222 阅读 · 0 评论 -
《算法图解》JavaScrip实现二分查找、选择排序
二分查找代码如下:function binarySearch(arr,val){ let start = 0; let end = arr.length -1; let guess; while(start<=end){ //mid是索引 let mid = Math.ceil((start+end)/2); //guess是不断寻找的中间值,mid索引对应的值 ...原创 2019-05-14 16:25:15 · 163 阅读 · 0 评论 -
JavaScript版《剑指offer》刷题(8)跳台阶
1.题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。2.题目分析题目很简单,稍微分析就知道这是斐波那契数列,所以可以动态规划来做a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)c.由a\b假设可以得出总跳法为: ...原创 2019-06-12 18:49:54 · 166 阅读 · 0 评论