算法和手写代码
算法和手写代码
婧大
一切都会有的,未来可期
展开
-
【JS 手写Plan】篇3
今天主要是一些数组的操作和方法其中一些去重,扁平,求和之类的方式有多种哦❤数组乱序var arr = [1,2,3,4,5,6,7,8,9];for (var i = 0;i < arr.length;i++) { // Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。 // 四舍五入的原理是在参数上加0.5然后进行下取整。 const randomIndex = Math.round(Math.random() *原创 2021-09-14 09:34:30 · 233 阅读 · 0 评论 -
【JS手写Plan】 篇2
js基础手写第二篇callfunction mycall(context) { // 判断它是一个对象 function if (typeof this !== 'function') { console.log('错误') } // 获取参数1 slice() 方法可从已有的数组中返回选定的元素。 1 从索引为1的地方开始截取 let args = [...arguments].slice(1) // 定义结果值 let r原创 2021-09-13 09:38:32 · 240 阅读 · 0 评论 -
【JS 手写Plan】篇1
整理一些面试常见的js手写题,冲鸭❤Object.create()function create(obj) { function F() { } F.prototype = obj; return new F();}/** * 1. 创建一个函数F * 2. 将obj作为F的原型对象 * 3. 返回由这个构造函数创建的实例 */instanceOffunction myInstanceof(left,right) { let prototy原创 2021-09-12 16:44:45 · 253 阅读 · 0 评论 -
【算法-链表】删除排序链表中的重复元素 II
82. 删除排序链表中的重复元素 II存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。/** * @param {ListNode} head * @return {ListNode} */var deleteDuplicates = function(head) {// 边界 if (!head) { return head; }//原创 2021-08-30 10:16:09 · 105 阅读 · 0 评论 -
【算法】121. 买卖股票的最佳时机
121. 买卖股票的最佳时机给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。利润如果要最高的话 A-B 首先要保证B的值是最小/** * @param {number[]} pri原创 2021-08-18 21:08:44 · 102 阅读 · 0 评论 -
【算法两道】 最大子序和 && 三数之和
53. 最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。/** * @param {number[]} nums * @return {number} */var maxSubArray = function(nums) { let sum = 0; let max原创 2021-08-16 17:32:19 · 100 阅读 · 0 评论 -
【算法两道】删除字符串中的所有相邻重复项&&链表求和
1047. 删除字符串中的所有相邻重复项/** * @param {string} s * @return {string} */var removeDuplicates = function(s) { let strArr = s.split('') if (strArr.length < 2) return str; for (let i = 0; i < strArr.length; i++) { if (strArr[i] === st原创 2021-08-12 19:37:42 · 141 阅读 · 0 评论 -
【算法两道】路径总和Ⅱ &最长回文子串
113. 路径总和 II给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。/* * function TreeNode(x) { * this.val = x; * this.left = null; * this.right = null; * } *//** * * @param root TreeNode类 * @param sum int整原创 2021-08-08 17:31:18 · 118 阅读 · 0 评论 -
【算法两道】岛屿数量 & 大数相加
200. 岛屿数量/** * 判断岛屿数量 * @param grid char字符型二维数组 * @return int整型 */function solve( grid ) { let row = grid.length; let col = grid[0].length; let sum = 0; for (let i = 0;i < row;i++) { for (let j = 0;j < col;j++) {原创 2021-08-07 15:42:21 · 93 阅读 · 0 评论 -
【算法-字符串-两道】最长公共前缀 & 验证回文串
14. 最长公共前缀编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入:strs = ["flower","flow","flight"]输出:"fl"大概思路就是把整个字符串数组遍历一下,得到它的每一项,flowerflowflightstr[0] [0] = str[1] [0] = str[2] [0]双重循环,对比每一项对应的字符是否相等,一旦出现不相等的情况,截取出来 ans = ans.slice(0,j);原创 2021-08-04 21:44:35 · 146 阅读 · 0 评论 -
【算法-字符串-两道】 比较版本号 & 括号生成
165. 比较版本号输入:version1 = "0.1", version2 = "1.1"输出:-1解释:version1 中下标为 0 的修订号是 "0",version2 中下标为 0 的修订号是 "1" 。0 < 1,所以 version1 < version2先把两个字符串转换成数组取最长的长度遍历如果没有值就设置成0否则把数字前的0去除/** * @param {string} version1 * @param {string} version2原创 2021-08-03 17:27:28 · 161 阅读 · 0 评论 -
【算法】151. 翻转字符串里的单词 [trim() 的实现]
151. 翻转字符串里的单词给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。说明:输入:s = "the sky is blue"输出:"blue is sky the"/** * @param {string} s * @return {string} */var reverseWords = function(s) { ret原创 2021-08-02 21:44:24 · 151 阅读 · 0 评论 -
【算法】5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。/** * @param {string} s * @return {string} */var longestPalindrome = function(s) { if(!s || s.length < 2){ // 边界 return s; } // 设置两个索引,用来取最后结果的索引值原创 2021-08-02 21:30:20 · 74 阅读 · 0 评论 -
【手写】一些情景题 记录
1. 实现每隔一秒打印1234可以使用es6的let 也可以使用var+立即执行函数function print() { for (let i = 0; i < 5; i++) { setTimeout(() => { console.log(i) },1000 * i) }}print()// 或者是下面这样function print() { for (var i = 0; i < 5;原创 2021-08-02 14:45:37 · 220 阅读 · 0 评论 -
【算法-字符串】415. 字符串相加
415. 字符串相加给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。/** * @param {string} num1 * @param {string} num2 * @return {string} */var addStrings = function(num1, num2) { let len1 = num1.length - 1; let len2 = num2.length - 1; let carray = 0; let a原创 2021-07-27 21:28:03 · 167 阅读 · 0 评论 -
【算法】剑指 Offer 54. 二叉搜索树的第k大节点
剑指 Offer 54. 二叉搜索树的第k大节点给定一棵二叉搜索树,请找出其中第k大的节点。方法一先遍历全部节点放到数组里面(去重)排序/** * @param {TreeNode} root * @param {number} k * @return {number} */var kthLargest = function(root, k) { let res = new Set() function dfs(root) { if (root原创 2021-07-20 20:55:39 · 84 阅读 · 0 评论 -
【算法三道】 543. 二叉树的直径 &&二叉树的层序遍历(右视图和锯齿形)
543. 二叉树的直径给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。它题目所说的直径其实是这样:4-2-1-35-2-1-3相当于左子树的深度 和右子树的深度 都取最大 然后相加 (需要加上根节点)/** * @param {TreeNode} root * @return {number} */var diameterOfBinaryTree = function(root) { let ma原创 2021-07-19 20:53:51 · 106 阅读 · 0 评论 -
【算法】105. 从前序与中序遍历序列构造二叉树
给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。/** * @param {number[]} preorder * @param {number[]} inorder * @return {TreeNode} */var buildTree = function(preorder, inorder) { if(!inorder.length) return null let tmp = preorder[0],mid = in原创 2021-07-18 18:38:28 · 118 阅读 · 0 评论 -
【算法】129. 求根节点到叶节点数字之和
129. 求根节点到叶节点数字之和给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。计算从根节点到叶节点生成的 所有数字之和 。叶节点 是指没有子节点的节点。这个是需要递归全遍历整个树的递归函数需要一个root 和一个res(和)定义一个sum = res*10 + root.val如果root的左右子树都为空 直接返回sum原创 2021-07-18 18:10:15 · 258 阅读 · 0 评论 -
【算法三道】二叉树的最近公共祖先&&路径总和 一 二
236. 二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”这个题目先看懂官方题解就是有两种可能一种就是如果当前节点就是最近的公共节点,那么这个节点的右子树和左子树分别都有一个参数(q|p)一种就是当前节点就是参数中的一个,假设是q,那么存在的情况就是,另一个p可能存在q节点原创 2021-07-17 21:23:13 · 170 阅读 · 0 评论 -
【算法两道】相同的树 && 翻转二叉树
100. 相同的树给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。/** * @param {TreeNode} p * @param {TreeNode} q * @return {boolean} */var isSameTree = function(p, q) { function helpFun(root1,root2) { if (root1 === null &a原创 2021-07-16 20:50:22 · 203 阅读 · 0 评论 -
【算法】平衡二叉树
输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。/* function TreeNode(x) { this.val = x; this.left = null; this.right = null;} */function IsBalanced_Solut原创 2021-07-08 09:48:10 · 79 阅读 · 0 评论 -
【算法】二叉树的最大深度
描述求给定二叉树的最大深度,最大深度是指树的根结点到最远叶子结点的最长路径上结点的数量。/* * function TreeNode(x) { * this.val = x; * this.left = null; * this.right = null; * } *//** * * @param root TreeNode类 * @return int整型 */function maxDepth( root ) { // write code原创 2021-07-08 09:37:00 · 90 阅读 · 0 评论 -
【算法】链表中环的入口结点
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。这个题目和判断链表是否有环的思路差不多都是先利用快慢指针去判断链表里面是否有环,再判断哪个是环的头节点如果pHead !== s,就让头节点和慢节点接着遍历,直到他们相等,指向的就是环的头节点 if (f == s) { while(pHead !== s) { pHead = pHead.next; s = s.next; } return原创 2021-07-07 09:42:09 · 96 阅读 · 0 评论 -
【算法】 两个链表的第一个公共结点
输入两个无环的单链表,找出它们的第一个公共结点。举个栗子:pHead1: 1-2-3-4-6-7pHead2: 4-5-6-7那么这两条无环链表的公共节点就是6-7设定两个指针分别指向这两条链表的头节点当这两指针指向的节点不相等时一直遍历下去 p1 = p1 === null ? pHead2 : p1.next; p2 = p2 === null ? pHead1 : p2.next; 如果某一条遍历完了就指向另一条链表的头节点继续遍历,否则就是next就可以最后返回那些相等原创 2021-07-06 09:38:49 · 124 阅读 · 0 评论 -
【算法】删除链表的倒数第n个节点
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针例如,给出的链表为: 1-> 2-> 3 ->4 ->5 1→2→3→4→5, n= 2n=2.删除了链表的倒数第 nn 个节点之后,链表变为1-> 2-> 3-> 5 1→2→3→5.使用的是快慢指针这里要注意的是,先要把fast走完之后,slow再走/* * function ListNode(x){ * this.val = x; * this.next = nul原创 2021-07-05 10:04:47 · 72 阅读 · 0 评论 -
【算法】最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。/** * @param {string} s * @return {string} */var longestPalindrome = function(s) { if (s.length < 2) { return s } res = '' for (let i = 0; i < s.length;i++) { func(i, i); func(i,i +原创 2021-07-04 14:55:00 · 76 阅读 · 0 评论 -
【算法】翻转字符串
写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)/** * 反转字符串 * @param str string字符串 * @return string字符串 */function solve( str ) { // write code here // return str.split('').reverse().join('') let arr = str.split('') let l = 0, r = ar原创 2021-07-04 14:19:49 · 96 阅读 · 0 评论 -
【算法】括号匹配
给出一个仅包含字符’(’,’)’,’{’,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。这个题目,主要是用到了一个栈的数据结构,(没写过真的很难想到。手动狗头)‘[’,‘]’,‘[’,‘}’ 就假设我们现在有这么个括号序列吧,按照下面代码的逻辑,遍历一下这个括号序列,如果遇到了左边的括号序列,就把对应右边的序列入栈,首先遇到 ‘[’ 把 ‘]’入栈遇到‘]’ 这个是不原创 2021-07-03 11:31:28 · 174 阅读 · 0 评论 -
【算法】最小k个数
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组这个的话感觉就是先排序,然后取值,可能有更好的方式吧排序的话 选择 冒泡 快排都可以 也可以用js的sortfunction GetLeastNumbers_Solution(input, k){ // write code here // 排序 if (input.length < k) retur原创 2021-07-03 11:02:32 · 85 阅读 · 0 评论 -
【算法】合并两个有序的数组
给出一个整数数组 和有序的整数数组 ,请将数组 合并到数组 中,变成一个有序的升序数组A: [1,2,3,0,0,0],m=3B: [2,5,6],n=3合并过后A为:A: [1,2,2,3,5,6]这个合并需要注意的是,要从后面开始,才不会乱哦/** * * @param A int整型一维数组 * @param B int整型一维数组 * @return void */function merge( A, m, B, n ) { // write code her原创 2021-07-02 09:49:05 · 213 阅读 · 0 评论 -
【算法】 判断链表中是否有环
判断给定的链表中是否有环。如果有环则返回true,否则返回false。使用的是快慢指针如果链表里面有环,那么总有一个时刻快指针和慢指针会相遇最开始的时候 fast slow 都指向头节点开始遍历,fast走两步,slow走一步 一直到fast != null && fast.next != null如果在两个指针走的过程中,存在fast == slow存在环否则返回false/* * function ListNode(x){ * this.val = x;原创 2021-07-02 09:32:30 · 124 阅读 · 0 评论 -
【算法】 用两个栈实现队列
用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。首先得先要有两个栈 s1,s2队列的特点是 先进先出 假设[1,2,3,4] 最后应该还是【1,2,3,4】栈的特点是 先进后出假设有[1,2,3,4],当它入栈S1【4321】5. 把它出栈到s2【1234】再出栈 【1,2,3,4】 ok 解决var s1 = []var s2 =原创 2021-07-01 09:38:56 · 164 阅读 · 0 评论 -
【算法】求二叉树的层序遍历
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)该二叉树层序遍历的结果是[[3],[9,20],[15,7]]单独从结果上来看,这是个二维数组,我们可以先定义一个res = []作为存储最后结果,中间还需要定义一个 arr = []用来存储每一层的遍历值/* * function TreeNode(x) { * this.val = x; * this.left = null; * this.right = null; * } *//*原创 2021-07-01 09:19:17 · 182 阅读 · 0 评论 -
【算法】最长无重复子数组
给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组这个题目主要是考察对数组的操作不重复不重复就是直接用数组的方法,判断一下是否存在let index = a.indexOf(arr[i])如果存在,就把(0,index+1)的子数组给去掉 indexOf返回的是如果数组里面有这个元素的第一个下标值,假设开始的子数组为[1,2,3,4],如果下原创 2021-06-30 09:54:02 · 1165 阅读 · 0 评论 -
【算法】跳台阶
描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。function jumpFloor(number){ // write code here if (number === 1) return 1; if (number === 2) return 2; return jumpFloor(number - 1) + jumpFloor(number - 2)}module.exports = {原创 2021-06-29 09:46:40 · 82 阅读 · 0 评论 -
【算法】反转链表
输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}/*function ListNode(x){ this.val = x; this.next = null;}*/function ReverseList(pHead){ // write code here if(!pHead) return let p = null; let next = null; while (pHead) {原创 2021-06-28 09:55:32 · 70 阅读 · 0 评论 -
【算法】设计LRU缓存结构
设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构get(key):返回key对应的value值[要求]set和get方法的时间复杂度为O(1)某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。若opt=1,接下来两个整数x, y,表示set(x, y)若opt=2,接下来一个整数x,表示get(x)原创 2021-06-28 09:52:28 · 203 阅读 · 2 评论 -
有关树遍历的javascript实现【前端-总结-leetcode算法题】
有关树遍历的javascript实现前言1、树和二叉树1.1、 树1.1.1 树的基本概念1.1.2 树的深度优先遍历(DFS)1.1.3 树的广度优先遍历(BFS)1.2、二叉树1.2.1 二叉树的基本概念1.2.2 二叉树的先序遍历递归版非递归版1.2.3 二叉树的中序遍历递归版非递归版1.2.4 二叉树的后序遍历递归版非递归版2、 leetcode算法题94、 二叉树的中序遍历102、 二叉树的层序遍历104、二叉树的最大深度111、 二叉树的最小深度112、路径总和3、前端有关遍历JSON的所有值.原创 2021-02-01 12:28:06 · 266 阅读 · 0 评论 -
【算法】160、相交链表
160、相交链表题目描述解题思路1、要得出相交的节点值,就是要判断两条链表相交的位置2、首先遍历两条链表3、将pA,pB分别指向两条链表的头结点,并且开始往下遍历4、假设A为长链表,B为短链表5、我们知道,肯定会出现B链表先遍历到最后的节点,也就是指针指向null6、当出现这种情况时,我们先将pB指向A链表的头结点,继续往下遍历7、同时,我们也应该知道,此时长链表也会继续遍历,当它的遍历到最后的节点时,也就是指针指向null时,我们将pA指针指向B的头结点。8、A,B两条链表继续遍历原创 2020-09-07 14:42:52 · 146 阅读 · 0 评论