随笔分类 -  算法

摘要:题目:打印 1-10000 之间的对称数(回文) 思路: 思路1:使用数组反转 数字转换为字符串 字符串转换为数组 reverse,再join 生成字符串 比较前后字符串 思路2:使用字符串头尾比较 数字转换为字符串 字符串头尾比较 思路3: 生成反转数 通过 % 和 Math.floor 将数字生 阅读全文
posted @ 2025-02-28 17:29 yangkangkang 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目:用 JavaScript 实现快速排序,并说明时间复杂度 思路: 快速排序是基础算法之一,算法思路是固定的 找到中间位置 midValue 遍历数组,小于 midValue 放在 left, 大于midValue 放在right 继续递归。最后 concat 拼接,返回 代码实现: /** * 阅读全文
posted @ 2025-02-28 15:35 yangkangkang 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目:给一个字符串,找出连续最多的字符,以及次数。如:'aabbcccddeeee112233' 连续最后的是e ,4次 分析: 传统方式,嵌套循环 嵌套循环,找出每个字符的连续次数,并记录比较 时间复杂度:因为是嵌套循环,所以看似是O(n^2), 但因为循环中有跳转,所以实际上它是O(n) 双指针 阅读全文
posted @ 2025-02-28 14:39 yangkangkang 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目:将数组中的 所有 0 都移动到末尾,如输入[1,0,3,0,11,0],输出[1,3,11,0,0,0]。要求: 只移动 0, 其他数字顺序不变 考虑时间复杂度 必须在原数组进行操作 分析: 传统方式(不可取) 遍历数组 遇到 0 push 到数组末尾 然后用 splice截取掉当前元素 时间 阅读全文
posted @ 2025-02-28 09:27 yangkangkang 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目:一直青蛙,一次可以跳1个台阶,也可以跳2个台阶,问该青蛙跳上n级台阶,总共需要多少种方式 分析: f(1) = 1 跳 1级台阶只有一种方式 f(2) = 2 跳 2级台阶,有两种方式 f(n) = f(n-1) + f(n-2) 跳n级,可拆分成两个问题 第一次跳,要么跳1级,要么跳2级 第 阅读全文
posted @ 2025-02-26 14:54 yangkangkang 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目: 用JS 计算 第n个斐波那契数列的值,之一时间复杂度 分析: 斐波那契数列 f(0) = 0 f(1) = 1 f(n) = f(n-1) + f(n-2) 前两个值的和 递归实现 这种方式会导致很多重复计算 时间复杂度是O(2^n),爆炸式增长,不可用(试试n=100,程序会卡死) 循环实 阅读全文
posted @ 2025-02-26 14:29 yangkangkang 阅读(7) 评论(0) 推荐(0) 编辑
摘要:为何二叉树如此重要,而不是三叉树四叉树? 性能对比: 数组:查找块O(1),增删慢O(n) 链表: 查找慢O(n),增删块O(1) 二叉搜索树BST: 查找快、增删快。二叉树可以使用二分法算法 平衡二叉树 BST如果不平衡,那就成了链表了,无法做到最优秀 所以要尽量平衡,即平衡二叉搜索树 BBST 阅读全文
posted @ 2025-02-26 00:23 yangkangkang 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目: 一个二叉搜索树,求其中的第K小的节点值。如下图,第3小的节点是4 什么是二叉树: 是一棵树 每个节点最多能有 2 个字节点。数据结构如下:{value, left,right} interface ITreeNode { value: number // 或其它类型 left?: ITree 阅读全文
posted @ 2025-02-25 23:55 yangkangkang 阅读(10) 评论(0) 推荐(0) 编辑
摘要:题目: 有一个递增的数组[1,2,4,7,11,15]和 一个 n =15 数组中只有两个数和是n。即 4+11 15 写一个JS函数,找出这两个数 思路: 思路1: 嵌套循环,找到一个数,然后遍历下一个数,求和,判断。 时间复杂度:O(n^2),不可用 思路2: 双指针 定义 i 指向头,j 指向 阅读全文
posted @ 2025-02-25 16:23 yangkangkang 阅读(3) 评论(0) 推荐(0) 编辑
摘要:用二分实现的关键点: 凡有序,必二分 凡二分,时间复杂度比包含O(logn) 可以用递归 和 非递归 两种方式实现 递归实现的二分,逻辑更清晰一些 用非递归实现,性能更好一些 代码实现: 非递归实现二分法 export function binarySearch1(arr:number[],targ 阅读全文
posted @ 2025-02-25 13:20 yangkangkang 阅读(4) 评论(0) 推荐(0) 编辑
摘要:问题:链表和数组,哪个队列更快? 分析: 队列是先进后出 数组是连续存储的,push很快,shift 很慢 链表是非连续存储,add 和 delete 都很快 结论:链表实现队列更快 链表实现队列 单向链表,要同时记录 head 和 tail 要从tail 入队,从head 出队 length要实时 阅读全文
posted @ 2025-02-24 17:53 yangkangkang 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目: 定义一个函数,输入一个单向链表的头节点,反转该链表,并输出反转后的头节点 思路: 链表数据结构: 单向链表:{value,next} 双向链表:{value,prev,next} 链表是数组的补充,数组需要一段连续的内存空间,而链表是零散的 链表查询慢,新增和删除块;数组查询块,新增和删除较 阅读全文
posted @ 2025-02-24 16:44 yangkangkang 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目: 用两个栈,实现一个队列 包括功能:添加队列、删除元素、队列长度 思路: 什么是队列 队列是先进先出。 简单的可以用数组、链表实现 复杂的队列服务,需要单独设计 栈我们用数组来实现 队列的添加 add 往 stack1 中push 元素 队列删除 将stack1 中的所有元素pop出来,pus 阅读全文
posted @ 2025-02-23 20:30 yangkangkang 阅读(1) 评论(0) 推荐(0) 编辑
摘要:题目: 一个字符串可能包含{}()[]三种括号,判断该字符串是否括号匹配。如:(a{b}c)匹配的 ;{a(b 和 {a(b)c) 不匹配 思路: 该题考查的是--栈 栈是一种逻辑结构,一种理论模型。可以脱离编程语言单独讲 栈是先进后出。可以用数组、链表来表达,也可自定义calss Stack{} 阅读全文
posted @ 2025-02-23 17:08 yangkangkang 阅读(1) 评论(0) 推荐(0) 编辑
摘要:题目:将一个数组旋转 k步。如输入一个数组[1,2,3,4,5,6,7] 和 k = 3, 即旋转 3步。输出 [5,6,7,1,2,3,4] 解题思路: 思路1: 把k 后面的元素,挨个pop,然后unshif 到数组前面 思路2: 将 k 后面的所有数据拿出来作为 part1 将 k前面的所有数 阅读全文
posted @ 2025-02-23 16:40 yangkangkang 阅读(2) 评论(0) 推荐(0) 编辑
摘要:时间复杂度 定义:指执行这个算法所需要的计算工作量(CPU) 常见的复杂度有: O(1) 常数型 -- 无循环 O(log n) 对数型 -- 二分法 O(n) 线性型 -- 单次循环 O(nlogn) 线性对数型 -- 单次循环 + 二分法 O(n^2) 平方型 -- 嵌套循环 O(n^3) 立方 阅读全文
posted @ 2025-02-23 10:16 yangkangkang 阅读(6) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示