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