随笔分类 -  20.algorithm

1
算法
摘要:算法练习(20)-平滑加权轮询算法所有负载均衡的场景几乎都会用到这个算法:假设有2个服务器A、B,其中A的分配权重为80,B的分配权重为20,当有5个请求过来时,A希望分到4次,B希望分到1次。 一个很自然的想法:A-A-A-A-B ,按权重顺序依次分配,同时计数,每分配1次,计数减1,减到0后,再分配『次权重』的服务器。 看上去好 阅读全文
posted @ 2022-02-20 20:33 菩提树下的杨过 阅读(661) 评论(1) 推荐(3) 编辑
摘要:算法练习(19)-单源最短路径dijkstra算法如上图,先初始化1个图,每条边上的红色数字为路径权重:(Node,Edge的定义参见算法练习(17)-图的广度优先遍历/深度优先遍历) Graph init() { List<Node> nodes = new ArrayList<>(); List<Edge> edges = new ArrayL 阅读全文
posted @ 2021-11-14 19:24 菩提树下的杨过 阅读(259) 评论(0) 推荐(0) 编辑
摘要:算法练习(18)-图的拓扑排序如上图,假设有一个大型代码工程,里面有5个模块: 模块1依赖模块2 模块2依赖模块3和模块5 模块3依赖模块4和模块5 那么,项目在编译时,应该按怎样的的顺序编译? 这就是所谓的拓扑排序问题 就这个示例而言,显然正确的编译顺序是:5->4->3->2->1 或 4->5->3->2->1 (注:4与 阅读全文
posted @ 2021-11-07 19:07 菩提树下的杨过 阅读(274) 评论(0) 推荐(0) 编辑
摘要:算法练习(17)-图的广度优先遍历/深度优先遍历一、图的数据结构及表示法 如上图,由一堆"点"与一堆"边"构成的数据结构 ,就称为图,其中边上可以有方向(称为有向图),也可以无方向(称为无向图)。边上还可以有所谓的权重值。 算法书上,图的表示方法一般有“邻接矩阵”等,这里我们用左程云介绍的一种相对更容易理解的表示法: 图: import java 阅读全文
posted @ 2021-11-07 16:50 菩提树下的杨过 阅读(1577) 评论(0) 推荐(0) 编辑
摘要:算法练习(16)-水平翻转一颗二叉树思路:依旧还是层次遍历, 按层入队, 然后出队时, 交换左右节点 阅读全文
posted @ 2021-11-03 12:07 菩提树下的杨过 阅读(102) 评论(0) 推荐(0) 编辑
摘要:算法练习(15)-设计1个二叉树的序列化与反序列化实现?思路: 二叉树的各种顺序中,随便挑1种,遍历每个节点, 拼装出1个字符串即可实现序列化。要注意的是, 空节点也需要, 可以找一个特殊符号比如#表示。 反序列化则是相反的过程,解析该字符串即可。 这里用层序遍历来实现一把: 序列化代码: public static String serial(Tree 阅读全文
posted @ 2021-11-02 23:23 菩提树下的杨过 阅读(80) 评论(0) 推荐(0) 编辑
摘要:算法练习(14)-二叉树中2个节点的最近公共祖先?比如这颗树,给定2个节点: 4、5 ,它们的最近公共祖先节点为2。类似的,如果是3、5,它们的最近公共祖先节点为1。 一种比较容易想到的思路,如果知道每个节点到root的全路径, 比如 3到root节点的全路径为: 3->1 5到root节点的全路径为: 5->2->1 这样,只要遍历对比下全路径, 阅读全文
posted @ 2021-10-31 22:37 菩提树下的杨过 阅读(112) 评论(0) 推荐(0) 编辑
摘要:算法练习(13)-打印纸条对折的折痕类型(凹痕?凸痕?)从左神视频上看到一个有趣的题目,据说是微软的算法面试题:一个长纸条,对折后再展开,中间会有一个凹痕,然后同样的方式,再继续对折, 又会多出2条折痕(不过新折痕会有凸有凹),如此反复对折,纸条上就会留下一系列的折痕,见下图: 要求:输入1个数字(n),表示对折的次数, 从上而下, 打印每1条拆痕的类型 阅读全文
posted @ 2021-10-31 12:58 菩提树下的杨过 阅读(273) 评论(0) 推荐(0) 编辑
摘要:算法练习(12)-二叉树的递归套路如果二叉树的问题,可以分解为 先处理左树, 再处理右侧, 这种就可以用所谓"递归套路"解法 阅读全文
posted @ 2021-10-31 12:37 菩提树下的杨过 阅读(130) 评论(0) 推荐(0) 编辑
摘要:算法练习(11)-二叉树的各种遍历二叉树的节点结构如下: public class TreeNode { public TreeNode left; public TreeNode right; public int val; public TreeNode(int val) { this.val = val; } public T 阅读全文
posted @ 2021-10-27 22:33 菩提树下的杨过 阅读(342) 评论(0) 推荐(0) 编辑
摘要:算法练习(10)-求2个(可能有环的)单链表的相交节点这个问题可以看做是 算法练习(7)-判断单链表是否有环,以及求环的长度 的升级版 阅读全文
posted @ 2021-10-23 17:05 菩提树下的杨过 阅读(55) 评论(0) 推荐(0) 编辑
摘要:算法练习(9)-复制带随机指针的单链表所谓带随机指针的链表,结构如下: class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null; this.random = null; } } 除next外 阅读全文
posted @ 2021-10-23 16:27 菩提树下的杨过 阅读(83) 评论(0) 推荐(0) 编辑
摘要:算法练习(8)-判断单链表是否回文链表在一些文学作品中,大家想必接触过回文诗,比如:“雾窗寒对遥天暮,暮天遥对寒窗雾”或“垂帘画阁画帘垂”,即:正着念反着念完全一样。回文单链表跟这个类似,比如: 0-1-2-1-0或0-1-1-0,很容易发现规律:可以找到一个对称轴,将链表分为前后二段,并且前后对折起来,完全重合。 为了方便,先定义单链 阅读全文
posted @ 2021-10-17 21:23 菩提树下的杨过 阅读(260) 评论(0) 推荐(0) 编辑
摘要:算法练习(7)-判断单链表是否有环,以及求环的长度如上图,一个单链表,如何判断有没有环? 如果有,如何求环的长度? 如果面试时,遇到这个题目,先喝口水压压惊,回想一下,咱们小时候念小学时,数学老师最喜欢的一类题目: 跑道上,2个运动员,1个速度是3m/s,1个速度是5m/s,同一起点起跑后,多久运动员2会再次遇到运动员1?是不是感觉异曲同工? 这2 阅读全文
posted @ 2021-03-27 16:49 菩提树下的杨过 阅读(196) 评论(0) 推荐(0) 编辑
摘要:算法练习(6)-O(1)时间复杂度判断1个正整数是否为2的幂次方原数(10进制) 原数(2进制) 原数-1(2进制) 1 1 0 2 10 01 4 100 011 8 1000 0111 16 10000 01111 观察上面的表格,如果1个数是2的幂次方,转换成2进制,必然最高位是1,其它位都是0,同时这个数减1后,所有有效位全是0,利用这个特点,做1次&位 阅读全文
posted @ 2021-03-27 15:52 菩提树下的杨过 阅读(146) 评论(0) 推荐(0) 编辑
摘要:算法练习(5)-计数排序法及优化日常开发中,会遇到一些特定的排序场景:“待排序的值”范围很明细,比如:基金的星级排名,客服的好评星级排名,一般星级排名也就从1星到5星。这种情况下,有一个经典的“下标计数排序法”,可以用O(n)的时间复杂度完成排序: static void sort1(int[] arr) { if (arr == 阅读全文
posted @ 2021-03-25 20:04 菩提树下的杨过 阅读(215) 评论(0) 推荐(0) 编辑
摘要:算法练习(4)-数组去重合并这是日常工程中,经常会遇到的场景,拿到2个list,里面有重复元素,要求去重合并最终排序输出。 题目:2个数组,比如[1,1,6,8] , [6,8,9,1,10,4],要求合并去重并排序,即最终变成[1,4,6,8,9,10] 思路1 :TreeSet 实际java工程中,最直观的想法,就是利用现 阅读全文
posted @ 2020-07-10 22:48 菩提树下的杨过 阅读(859) 评论(0) 推荐(0) 编辑
摘要:算法练习(3)-寻找最大的不重复子串要求:给定1个字符串,比如ababc,要求找出“第1个最长的不重复子串”,即:"abc" 思路:遍历每个字符,寻找以它开头的不重复子串,遍历过程中,可以用一个Set作为缓冲区,存放曾经处理过的起始字符串。 过程: (a)babc -> 子串为a (ab)abc -> 子串为ab (ab)abc -> 阅读全文
posted @ 2020-06-26 17:26 菩提树下的杨过 阅读(791) 评论(0) 推荐(0) 编辑
摘要:算法练习(2)-删除有序数组/单链表中的重复项要求: 删除有序数组(或有序单链表)中的重复项。 示例: 输入[1,1,2,2,3] 输出[1,2,3] 输入a->b->b->c->c 输入a->b->c 思路: 双指针,慢指针从第1个有效元素开始,快指针从第2个有效元素开始,快指针对应的元素与慢指针对应的元素比较,如果发现相同,说明有重复,快指 阅读全文
posted @ 2020-06-26 10:42 菩提树下的杨过 阅读(466) 评论(0) 推荐(0) 编辑
摘要:算法练习(1)-字符串/单链表反转前提:不能借助其它数据结构或一些现成工具类。比如调用StringUtils.reverse(str)完成翻转,或者先入stack再出stack。仅使用最基本的分支/循环来实现最优解法。 一、字符串反转 java中字符串,其实就是一个字符数组,可以用数组的思路,首尾交换即可。 private Stri 阅读全文
posted @ 2020-06-24 16:07 菩提树下的杨过 阅读(520) 评论(0) 推荐(0) 编辑

1