- 博客(79)
- 收藏
- 关注
原创 2.继承总结方法
**## 继承** //ES6之前并没有给我们提供 extends 继承。我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承。2.1 call() /* call方法:调用这个函数, 并且修改函数运行时的 this 指向* fun.call(thisArg, arg1, arg2, …)* thisArg :当前调用函数 this 的指向对象* arg1,arg2:传递的其他参数* */ function fn(x,y) {console.log(‘我想喝手磨咖啡
2022-07-20 10:52:32
161
原创 5. 最长回文子串
5. 最长回文子串var longestPalindrome = function(s) { let len = s.length; let result; let i,j,L; let dp=Array(len).fill(0).map(x=>Array(len).fill(0)); if(len<=1){ return s } // 只有一个字符的情况是回文 for(i = 0;i<len;i++){ dp[i][i] = 1
2021-10-24 16:54:44
154
原创 ES5实现继承
构造函数继承父类属性核心原理:通过call()把父类型的this指向子类型的this,可实现属性继承function Father(name,age) { this.name = name; //this指向的是父构造函数的对象实例 this.age = age; } //子构造函数 function Son(name,age,score) { //使父构造函数中的this指向子构造函数中的this Father.call(this,name,age);
2021-10-12 15:40:55
524
原创 NC127 最长公共子串
NC127 最长公共子串滑动窗口法判断两个字符串长短,str1.length>str2.length则交换;循环遍历短字符串str1来截取子串,定义一个maxLen保存最长子串的长度;如果str1的字串存在str2中,则把字串赋值给res保存,并且flag++确保下次遍历截取str1子串的左区间保持原样,右区间向右滑动一个字符;如果str1的字串不存在str2中,flag不变,i++,窗口整体向右滑动一个字符/** * longest common substring * @pa
2021-09-10 12:33:29
106
原创 43. 字符串相乘
43. 字符串相乘思路普通竖式计算以num1 = 123 , num2 = 456为例:我们遍历 num2 每一位与 num1 进行相乘,将每一步的结果进行累加,在这个过程如果相乘或者相加的结果大于等于10 ,我们都要去满10进位,如下图所示:这样模拟普通竖式计算的方法较为复杂,我们可以考虑优化版的竖式计算。以下题解参考力扣上的一位大神优化竖式其实在相乘或者相加计算过程的每一位,我们可以考虑先不去满10进位,等到计算完所有的相乘结果以后,最终将其加到一块,再去满10进位 ,最后的结果和普通
2021-09-09 16:32:32
153
原创 415. 字符串相加
415. 字符串相加算法流程:设定 i,j 两指针分别指向 num1,num2 尾部,模拟人工加法;计算进位: 计算 carry = tmp / 10,代表当前位相加是否产生进位;添加当前位: 计算 tmp = n1 + n2 + carry,并将当前位 tmp % 10 添加至 res 头部;索引溢出处理: 当指针 i或j 走过数字首部后,给 n1,n2 赋值为 0,相当于给 num1,num2 中长度较短的数字前面填 0,以便后续计算。当遍历完 num1,num2 后跳出循环,并根据 ca
2021-09-09 15:24:13
110
原创 NC52 括号序列
NC52 括号序列方法一:借助辅助栈——左括号入栈,右括号出栈核心思想:每次遇到’(’,’{’,’[‘这三种字符的时候,将字符入栈stk;而每次遇到’)’,’}’,’]‘这三种字符的时候则让对应的匹配字符出栈。具体规则如下:1)引入辅助栈stk,遍历字符串,每次遇到’(’,’{’,’[‘字符的时候将字符入栈stk2)当遇到’)’,’}’,’]'字符的时候,则检查栈是否空,且顶元素是否为匹配元素(如{和}匹配等),如果栈空或者栈顶元素不为匹配元素则括号序列不合法3)当栈非空,且栈顶元素为匹配元素
2021-09-09 11:29:53
631
原创 NC3 链表中环的入口结点
NC3 链表中环的入口结点方法1 使用Set数据结构通过使用set或者map来存储已经遍历过的结点,当第一次出现重复的结点时,即为入口结点。/*function ListNode(x){ this.val = x; this.next = null;}*/function EntryNodeOfLoop(head){ let newSet = new Set(); while(head !== null){ if(newSet.has(head)
2021-09-09 10:56:34
470
原创 01.构造函数与原型(ES6)
**## 构造函数与原型**1.1 构造函数和原型在 ES6之前 ,对象不是基于类创建的,而是用一种称为构建函数的特殊函数来定义对象和它们的特征。创建对象可以通过以下三种方式:1. 对象字面量2. new Object()3. 自定义构造函数1.2 构造函数:构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。 在 JS 中,使用构造函数时要注意以下两点: 构
2021-09-08 16:45:00
79
原创 剑指 Offer II 002. 二进制加法
剑指 Offer II 002. 二进制加法算法流程:从右边对应位依次相加,判断能否被2整除取余数放入新字符串把除数放入变量carry,以供下次循环时对应位相加时使用跳出循环后,判断carry是否有值,如果有就加入新字符串...
2021-09-03 15:08:49
66
原创 1624. 两个相同字符之间的最长子字符串
1624. 两个相同字符之间的最长子字符串1.暴力解法var maxLengthBetweenEqualCharacters = function(s) { let max = -1,len = s.length; for(let i = 0;i<len;i++){ for(let j = i+1;j<len;j++){ if(s[j] == s[i]){ max
2021-09-03 09:53:05
161
原创 NC22 合并两个有序的数组
NC22 合并两个有序的数组直接push后排序/** * * @param A int整型一维数组 * @param B int整型一维数组 * @return void */function merge( A, m, B, n ) { // write code here for(let item of B){ A.push(item); } A.sort((a,b)=>a-b)}module.exports = {
2021-09-02 21:44:10
126
原创 NC41 最长无重复子数组
NC41 最长无重复子数组/** * * @param arr int整型一维数组 the array * @return int整型 */function maxLength( arr ) { // write code here let len = arr.length,maxLen = 0,a = [],index; for(var i =0;i<len;i++){ index = a.indexOf(arr[i]); //查找数组中是否
2021-09-02 20:09:59
93
原创 连续子数组的最大和
连续子数组的最大和暴力解法:时间复杂度:O(n^2)/** * max sum of the subarray * @param arr int整型一维数组 the array * @return int整型 */function maxsumofSubarray( arr ) { let max = Number.MIN_VALUE; for(var i = 0;i<arr.length;i++){ let sum = 0; for(v
2021-09-02 15:41:49
91
原创 k个一组翻转链表
k个一组翻转链表下图是一位力扣大佬的图解法,为了方便理解记忆步骤分解:链表分区为已翻转部分+待翻转部分+未翻转部分每次翻转前,要确定翻转链表的范围,这个必须通过 k 此循环来确定需记录翻转链表前驱和后继,方便翻转完成后把已翻转部分和未翻转部分连接起来初始需要两个变量 pre 和 end,pre 代表待翻转链表的前驱,end 代表待翻转链表的末尾经过k此循环,end 到达末尾,记录待翻转链表的后继 next = end.next翻转链表,然后将三部分链表连接起来,然后重置 pre 和 end
2021-09-02 11:20:19
86
原创 剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表1.递归function ListNode(x){ this.val = x; this.next = null;}/** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */var mergeTwoLists = function(l1,l2){ var newNode = new ListNode(null); if(l1 == nul
2021-09-01 11:03:29
98
原创 NC88 寻找第K大
NC119 最小的K个数基于快速排序的选择方法,只要某次划分的 基准pivot 为倒数第 k个下标的时候,我们就已经找到了答案。 我们只关心这一点,至于a[l⋯q−1] 和 a[q+1⋯r] 是否是有序的,我们不关心。function findKth( a , n , K ) { return quickfind(a,0,n-1,K) } function quickfind(a, left, right, k) { let i = left, j = right, p
2021-09-01 09:33:26
328
原创 102. 二叉树的层序遍历;深度优先遍历和广度优先遍历
深度优先遍历(DFS) 与广度优先遍历(BFS)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,深度优先就是自上而下的遍历搜索 广度优先则是逐层遍历对于算法来说 无非就是时间换空间 空间换时间深度优先不需要记住所有的节点, 所以占用空间小, 而广度优先需要先记录所有的节点占用空间大深度优先有回溯的操作(没有路走了需要回头)所以相对而言时间会长一点深度优先采用的是堆栈的形式, 即先进后出广度优先则采用的是队列的形式, 即先进先出深度优先遍历主要思路是从图
2021-08-31 16:02:42
1629
原创 NC119 最小的K个数
1.排序直观的做法是,将整个数组排好序后,取数组前k个或最后k个数,但这种方法时间复杂度较高(O(n*log(n))),在数据量很大的情况不适用。function GetLeastNumbers_Solution(input, k){ input.sort((a,b)=>{ return a-b; }) return input.slice(0,k)}module.exports = { GetLeastNumbers_Solution : G
2021-08-30 17:09:29
81
原创 NC45 实现二叉树先序,中序和后序遍历
比如上图正常的一个满节点,A:根节点、B:左节点、C:右节点,前序顺序是ABC(根节点排最先,然后同级先左后右);中序顺序是BAC(先左后根最后右);后序顺序是BCA(先左后右最后根)。先(根)序遍历(根左右):A B D H E I C F J K G A B C以ABC作为根节点继续 遍历中(根)序遍历(左根右) : D H B E I A J F K C G后(根)序遍历(左右根) : H D I E B J K F G C ANC.
2021-08-30 10:34:38
138
原创 NC93 设计LRU缓存结构
NC93 设计LRU缓存结构题目:代码如下:/** * lru design * @param operators int整型二维数组 the ops * @param k int整型 the k * @return int整型一维数组 */function LRU( operators , k ) { let hashMap = new Map(); let list = []; operators.forEach((item)=>{ if(
2021-08-29 16:39:21
70
原创 409.最长回文串
409.最长回文串var longestPalindrome = function(s) { var set = new Set(); var count = 0; for(var i=0; i<s.length; i++){ if(set.has(s[i])){ count +=2; set.delete(s[i]) }else{ set.add(s[i])
2021-08-25 16:40:45
67
原创 回文数判断
判断一个数是不是回文数 var isPalindrome = function(x) { if ( x < 0 ) return false let str = '' + x return Array.from(str).reverse().join('') === str }; console.log(isPalindrome(1211));
2021-08-25 16:25:53
84
原创 对象的扁平化
/* * 需要对象进行遍历,把里面的属性值依次输出, * 所以我们可以知道核心方法体就是:传入对象的 key 值和 value,对 value 再进行递归遍历。 * 我们知道 js 的数据类型可以基础数据类型和引用数据类型, * 对于题目而言,基础数据类型无需再进行深层次遍历,引用数据类型需要再次进行递归。 * */ let flatten = (obj) => { let result = {}; let process = (key, value) =&
2021-08-23 12:40:54
204
原创 滑动窗口的最大值
/** * @param {number[]} nums * @param {number} k * @return {number[]} */var maxSlidingWindow = function(nums, k) { if(k<=1) return nums; const res = []; for(var i =0;i<nums.length-k+1;i++){ res.push(Math.max(...nums.slice(i,.
2021-08-22 20:41:04
66
原创 使用ES5和ES6求函数参数的和
//ES6 function sum(...nums) { let result = 0; nums.forEach(function (item) { result += item; }) return result; } //ES6 function sum() { let result = 0; Array.prototype.forEach.call(arguments,function (item) { ..
2021-08-22 15:58:06
218
原创 实现数组元素求和
reduce先去扁平化再求和递归实现let arr=[1,2,3,4,5,6,7,8,9,10]; let sum = arr.reduce((pre,cur)=>{ return pre+cur; },0) console.log(sum); var arr=[1,2,3,[[4,5],6],7,8,9]; let newArr = arr.toString().split(',').map((item)=>{return Number(item)}.
2021-08-21 21:45:53
881
原创 实现数组的乱序输出
//Math.round返回一个最接近的值,如果是0.5,上下距离一样,向正无穷方向取值,其实就是取较大的值。主要的实现思路就是:取出数组的第一个元素,随机产生一个索引值,将该第一个元素和这个索引对应的元素进行交换。第二次取出数据数组第二个元素,随机产生一个除了索引为1的之外的索引值,并将第二个元素与该索引值对应的元素进行交换按照上面的规律执行,直到遍历完成 var arr = [1,2,3,4,5,6,7,8,9,10]; for (var i = 0;i<arr.length;
2021-08-21 21:28:22
752
原创 二分法查找
1.二分法查找二分法查找算法: 采用二分法查找时,数据需是排好序的。 主要思想是:(设查找的数组区间为array[s, e]) (1)确定该区间的中间位置m (2)将查找的值T与array[m]比较,若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。 区域确定如下: 这里设array从小到大排列, array[m]>T由数组的有序性可知array[m,……,e]>T; 故新的区间为array[s,……,m-1], 类似上面查找区间arr
2021-08-21 15:03:34
133
原创 扁平化数组以及数组去重
扁平化数组以及数组去重并升序处理 function arrFlat(arr) { let newArr = arr.flat(Infinity); //去扁平化 return Array.from(new Set(newArr)).sort((a,b)=>a-b); }function arrFlat(arr) { let newArr = arr.toString().split(",").map(item => { return Number(ite
2021-07-28 09:49:23
97
原创 19. 删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 100
2021-07-28 09:47:56
161
原创 剑指 Offer 58 - II. 左旋转字符串
剑指 Offer 58 - II. 左旋转字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = "abcdefg", k = 2输出: "cdefgab"示例 2:输入: s = "lrloseumgh", k = 6输出: "umghlrlose"限制:1 <= k < s.length <
2021-07-27 16:39:44
92
原创 27. 移除元素
27. 移除元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,1,2,2,3,0,4,2], val = 2,函数应该返回新的长度 5
2021-07-27 12:02:42
157
原创 split、slice和splice方法
split:分裂、划分String.split() 执行的操作与 Array.join 执行的操作是相反的。slice:部分、片、薄片splice:粘接
2021-07-25 16:22:39
85
原创 题目:剑指Offer 05.替换空格
题目:剑指Offer 05.替换空格请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1: 输入:s = “We are happy.”输出:“We%20are%20happy.”思路1:借助字符串、数组方法/** * @param {string} s * @return {string} */var replaceSpace = function(s) { let res = s.split(" "); return res.join("%20");}
2021-07-25 16:12:15
88
原创 541. 反转字符串 II
541. 反转字符串 II给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。示例:输入: s = "abcdefg", k = 2输出: "bacdfeg"提示:该字符串只包含小写英文字母。给定字符串的长度和 k 在 [1, 10000] 范围内。思路:暴力解法在遍历字符串的过程中,只要让i +
2021-07-25 14:45:36
63
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人