
算法
文章平均质量分 80
CaseyWei
感激每个遇见的人
展开
-
(转)雪花算法(SnowFlake)
现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多个表中会生成重复的 id 值。那么如何保证水平分表后的多张表中的 id 是全局唯一性的呢?如果还是借助数据库主键自增的形式,那么可以让不同表初始化一个不同的初始值,然后按指定的步长进行自增。例如有3张拆分表,初始主键值为1,2,3,自增步长为3。原创 2023-05-12 14:51:33 · 1169 阅读 · 0 评论 -
(转)冒泡排序及优化详解
例如6,4,7,5,1,3,2,当我们进行第一次排序的时候,结果为6,7,5,4,3,2,1,实际上后面有很多次交换比较都是多余的,因为没有产生交换操作。可能在上面这个示例下,可能看不出来效果,但是当数组是,5,4,3,1,2的时候的时候就非常明显了,实际上在第一次循环的时候整个数组就已经完成排序,但是常规版的算法仍然会继续后面的流程,这就是多余的了。没错,这是已经排好序的啊,也就是说因为标志位的存在,上面的循环只会进行一遍,flag没有变成1,整个算法就结束了,这也就是O(n)的来历了!......原创 2022-07-27 10:07:25 · 1001 阅读 · 0 评论 -
(转)JS——一维数组转二维数组
使用场景举例:接口返回一个数组对象,展示时每行固定显示n个,则可将返回的数组转成二维数组[[...n], [...n]...]的形式循环展示。a.数组元素为基本类型: let baseArray = [1, 2, 3, 4, 5, 6, 7, 8]; len len = baseArray.length; let n = 4; //假设每行显示4个 let lineNum = len % 4 === 0 ? len / 4 : Math.floor( (len / 4) + 1 );原创 2021-04-01 09:01:09 · 450 阅读 · 0 评论 -
选择排序(JavaScript版)
实例:Array.prototype.selectionSort = function () { for (let i = 0; i < this.length - 1; i += 1) { let indexMin = i; for (let j = i; j < this.length; j_ = 1) { if (this[j] < this[indexMin]) { indexMin = j; } } .原创 2020-12-01 09:04:23 · 188 阅读 · 0 评论 -
冒泡排序(JavaScript版)
Array.prototype.bubbleSort = function () { for (let i = 0; j < this.length - 1; i += 1) { for (let j = 0; j < this.length - 1 - i; j += 1) { if (this[j] > this[j + 1]) { const temp = this[j]; this[j] = this[j + 1]; .原创 2020-11-30 10:37:11 · 200 阅读 · 0 评论 -
23. 合并K个升序链表(JavaScript版)
题目:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:li...原创 2020-11-30 10:16:12 · 508 阅读 · 1 评论 -
347. 前 K 个高频元素(JavaScript版)
题目:给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:你可以假设给定的k总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) ,n是数组的大小。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。你可以按任意顺...原创 2020-11-27 09:12:26 · 561 阅读 · 0 评论 -
215. 数组中的第K个最大元素(JavaScript版)
题目:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。解题:class MinHeap{ constructor() { this.heap = [] } //.原创 2020-11-27 08:13:42 · 336 阅读 · 0 评论 -
JavaScript 实现:最小堆类
class MinHeap{ constructor() { this.heap = [] } // 替换两个节点值 swap(i1,i2){ const temp = this.heap[i1]; this.heap[i1] = this.heap[i2]; this.heap[i2] = temp; } // 获取父节点 getParentIndex() { return (i -1) >> 1; //求除2的商 }.原创 2020-11-26 10:10:43 · 1094 阅读 · 3 评论 -
数据结构——堆
堆的:1.堆是一种特殊的完全二叉树2.所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。最大堆:图例:最小堆:图例:js中的堆:1.js中通常用数组表示堆。2.左侧子节点的位置是2*index+1。3.右侧子节点的位置是2*index+2。4.父节点位置是(index-1)/2图例:堆的应用:1.堆能高效、快速地找出最大值和最小值,时间复杂度:0(1)。2.找出第k个最大(小)元素。第k个最大(小)元素解题思路:.原创 2020-11-26 08:48:29 · 267 阅读 · 1 评论 -
(转)图的表示法与常用的转化算法
《图的表示方法》(i)邻接矩阵表示法,如图: 也就是说,如果两节点之间有一条弧,则邻接矩阵中对应的元素为1;否则为0。可以看出,这种表示法非常简单、直接。但是,在邻接矩阵的所有 个元素中,只有 个为非零元。如果网络比较稀疏,这种表示法浪费大量的存储空间,从而增加了在网络中查找弧的时间。 同样,对于网络中的权,也可以用类似邻接矩阵的 矩阵表示。只是此时一条弧所对应的元素不再是1,而是相应的权而已。如果网络中每条弧赋有多种权,则可以用多个矩阵表示这些权。(ii)关联矩阵表示法 .原创 2020-11-25 11:23:06 · 393 阅读 · 0 评论 -
65. 有效数字(JavaScript版)
题目:验证给定的字符串是否可以解释为十进制数字。例如:"0"=>true" 0.1 "=>true"abc"=>false"1 a"=>false"2e10"=>true" -90e3"=>true" 1e"=>false"e3"=>false" 6e-1"=>true" 99e2.5"=>false"53.5e93"=>true" --6 "=>...原创 2020-11-24 09:20:51 · 352 阅读 · 1 评论 -
图的深度优先遍历和广度优先遍历(JavaScript版)
1.深度优先遍历:算法口诀:1.访问根节点。2.对根节点的没访问过的相邻节点挨个进行深度优先遍历。实例:const graph = { 0: [1,2], 1: [2], 2:[0,3], 3: [3]}const visited = new Set();const dfs = (n) => { console.log(n); visited.add(n); graph[n].forEach(c=> { if(!visited原创 2020-11-24 09:03:32 · 391 阅读 · 0 评论 -
遍历 JSON 的所有节点值
const json = { a: { b: { c: 1 } }, d: [1, 2]}const dfs = (n, path) => { console.log(n, path); Object.keys(n).forEach(k => { dfs(n[k], path.concat(k)); })}dfs(json, []);原创 2020-11-23 09:59:10 · 855 阅读 · 0 评论 -
112. 路径总和(JavaScript版)
题目:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明:叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1返回 true, 因为存...原创 2020-11-20 08:46:41 · 284 阅读 · 0 评论 -
102. 二叉树的层序遍历(JavaScript版)
题目:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]解题:var levelOrder = function (root) { if(!root) return []; const q =[root];...原创 2020-11-19 20:25:01 · 369 阅读 · 0 评论 -
111. 二叉树的最小深度(JavaScript版)
题目:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root = [3,9,20,null,null,15,7]输出:2示例 2:输入:root = [2,null,3,null,4,null,5,null,6]输出:5提示:树中节点数的范围在[0, 105]内 -1000 <= Node.val <= 1000解题:var ...原创 2020-11-18 11:39:52 · 390 阅读 · 0 评论 -
二叉树的最大深度(JavaScript版)
题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度3 。解题:var maxDepth = function (root) { let res = 0; const dfs = (n, l) => { if (!...原创 2020-11-16 20:18:36 · 664 阅读 · 0 评论 -
二叉树的先中后序遍历(JavaScript非递归版)
1.先序遍历:const preorder = (root) => { if (!root) { return; } const stack = [root]; while (stack.length) { const n = stack.pop(); console.log(n.val); if (n.right) stack.push(n.right); if (n.left) stack.push(n.left); }}preorde原创 2020-11-16 08:56:12 · 272 阅读 · 1 评论 -
二叉树的先中后序遍历(JavaScript版)
1.先序遍历:先序遍历算法口诀:1.访问根节点2.对根节点的左子树进行先序遍历3.对根节点的右子树进行先序遍历实例:const bt = { val: 1, left: { val: 2, left: { val: 4, left: null, right: null }, right: { val: 5, left: null, right: { v原创 2020-11-13 18:31:35 · 265 阅读 · 0 评论 -
树的深度优先遍历和广度优先遍历(JavaScript版)
1.深度优先遍历:深度优先遍历:尽可能深的搜索树的分支。例如:算法口诀:1.访问根节点。2.对根节点的children挨个进行深度优先遍历。实例:2.广度优先遍历:广度优先遍历:先访问离根节点最近的节点。例如:...原创 2020-11-13 17:51:51 · 719 阅读 · 1 评论 -
76. 最小覆盖子串(JavaScript版)
题目:给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。示例 1:输入:s = "ADOBECODEBANC", t = "ABC"输出:"BANC"示例 2:输入:s = "a", t = "a"输出:"a"提示:1 <= s.length, t.length <= 105s 和 t 由英文字..原创 2020-11-12 20:10:18 · 446 阅读 · 0 评论 -
3. 无重复字符的最长子串(JavaScript版)
解题:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"...原创 2020-11-12 19:51:04 · 170 阅读 · 0 评论 -
1. 两数之和(JavaScript版)
题目:给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解题:var twoSum = function(nums, target) { const map = ...原创 2020-11-11 09:36:44 · 713 阅读 · 1 评论 -
349. 两个数组的交集(JavaScript版)
题目:给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。解题:var intersection = function(nums1, nums2) { return [...new Set(nu..原创 2020-11-11 09:11:55 · 250 阅读 · 0 评论 -
141. 环形链表(JavaScript版)
题目:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head..原创 2020-11-10 10:00:17 · 233 阅读 · 0 评论 -
83. 删除排序链表中的重复元素(JavaScript版)
题目:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例1:输入: 1->1->2输出: 1->2示例2:输入: 1->1->2->3->3输出: 1->2->3解题:var deleteDuplicates = function(head) { let p = head; while (p && p.next) { if(p.val === p.next..原创 2020-11-10 09:29:27 · 184 阅读 · 0 评论 -
2. 两数相加(JavaScript版)
题目:给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807解题:var addTwoNumbers =...原创 2020-11-10 09:09:23 · 987 阅读 · 0 评论 -
206.反转链表(JavaScript版)
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制:0 <= 节点个数 <= 5000解题:var reverseList = function(head) { let p1 =head; let p2 = null; while(p1) {..原创 2020-11-10 08:41:47 · 128 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点(JavaScript版)
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。题目:注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为1的第三个节点,那么在调用...原创 2020-11-09 08:48:50 · 167 阅读 · 0 评论 -
933. 最近的请求次数(JavaScript版)
题:写一个RecentCounter类来计算特定时间范围内最近的请求。请你实现 RecentCounter 类:RecentCounter() 初始化计数器,请求数为 0 。int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。保证每次对 ping 的调用都使用比之前更大的 t 值。示例 1:输入:["Rece...原创 2020-11-09 08:41:21 · 291 阅读 · 0 评论 -
20. 有效的括号(JavaScript版)
题目:给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例2:输入: "()[]{}"输出: true示例3:输入: "(]"输出: false示例4:输入: "([)]"输出: false示例5:输入: "{[]}"输出: true解:...原创 2020-11-07 15:18:20 · 851 阅读 · 0 评论 -
mac系统下nodejs中使用bcrypt加密
1.安装bcryptjsnpm install --save bcryptjs使用bcrypt模块的两种方式:sync同步方式实例:var bcrypt = require('bcrypt');router.post('/', checkNotLogin, function(req, res, next){ let password = req.fields.password //生成salt的迭代次数 const saltRounds = 10;原创 2020-09-24 09:31:15 · 386 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表(JavaScript版)
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000解:递归法和循环压栈逆序输出法,都是O(N)const reversePrint = function(head) { // 用递归法 const res = [] const reverse = (node) => { if(!node..原创 2020-09-11 18:05:31 · 169 阅读 · 0 评论 -
(转)JS中的算法与数据结构——链表(Linked-list)
链表(Linked-list)前面我们讨论了如何使用栈、队列进行存数数据,他们其实都是列表的一种,底层存储的数据的数据结构都是数组。但是数组不总是最佳的数据结构,因为,在很多编程语言中,数组的长度都是固定的,如果数组已被数据填满,再要加入新的元素是非常困难的。而且,对于数组的删除和添加操作,通常需要将数组中的其他元素向前或者向后平移,这些操作也是十分繁琐的。然而,JS中数组却不存在上述问题,主要是因为他们被实现了成了对象,但是与其他语言相比(比如C或Java),那么它的效率会低很多。这时候,原创 2020-09-11 17:20:45 · 190 阅读 · 0 评论 -
剑指 Offer 05. 替换空格(JavaScript版)
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."限制:0 <= s 的长度 <= 10000解:// 先复习下字符串操作API吧// replace实现const replaceSpace = function(s) { return s.replace(/ /g, '%20')};// split + joinconst rep..原创 2020-09-10 16:10:16 · 239 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找(JavaScript版)
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target=5,返回t...原创 2020-09-10 09:31:38 · 160 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字(JavaScript版)
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3解:var findRepeatNumber = function(nums) { const arr = new Array(nums.length) for(let n of nu.原创 2020-09-09 10:10:13 · 189 阅读 · 0 评论 -
(转)一套图 搞懂“时间复杂度”
写在前面:这篇文章是在公众号: 程序员小灰 中发布的。是我到目前为止所看到的关于时间复杂度介绍的最好的文章,清晰明了。所以拿来po出来 仅供学习交流,如侵则删。现已将此文收录至:《数据结构》C语言版 (清华严蔚敏考研版) 全书知识梳理同类好文:8种方法优雅地利用C++编程从1乘到20 从B站 (哔哩哔哩) 泄露的源码里发现了B站视频推荐的秘密 Facebook前身 哈佛“选美”网站 核心算法 --- ELO...原创 2020-09-09 10:03:32 · 261 阅读 · 0 评论 -
哈希(Hash)
在区块链的领域里,哈希算法可谓是被提到的最多的概念之一,很多人第一次听到这个概念也是因为区块链。那到底什么是哈希算法?除了区块链以外,哈希算法在生活中的其他领域还有那些应用呢?维基百科关于哈希算法的解释:> 散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据...原创 2019-07-15 23:17:43 · 4913 阅读 · 0 评论