From 92d58f76b14c90e811dcd1705d1e4e6355518f66 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 1 Sep 2021 10:08:04 +0800 Subject: [PATCH] update linkedHashmap --- 3 Hash Table/LinkedHashMap.md | 34 +++++++++++++----------- 9 Algorithms Job Interview/4 数值问题.md | 23 ++++++++++++++-- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/3 Hash Table/LinkedHashMap.md b/3 Hash Table/LinkedHashMap.md index 1144974..6f0bc74 100644 --- a/3 Hash Table/LinkedHashMap.md +++ b/3 Hash Table/LinkedHashMap.md @@ -2,12 +2,18 @@ java 中 LinkedHashmap的实现原理。LinkedHashmap继承自 HashMap。 -HashMap是无序的,迭代访问顺序并不一定与插入(put)顺序一致。 迭代顺序与插入顺序一致,这种叫做 插入有序。 +HashMap是无序的,迭代访问顺序并不一定与插入(put)顺序一致。LinkedHashMap 是有序的, 迭代顺序与插入顺序一致,这种叫做 插入有序。 + + +``` +``` + #### 特点 * 维护一个所有entry的双向链表 -* 构造函数 有一个 accessOrder 参数,控制访问顺序 (插入顺序 和 访问顺序); 其中,访问顺序比较适合做 LRU 缓存 +* 构造函数 有一个 accessOrder 参数,控制访问顺序 (插入顺序 和 访问顺序); +* 访问顺序的意思是,当有一个entry被访问以后,这个entry就被移动到链表的表尾。这个特性非常适合 LRU 缓存 (最近最少使用); #### 引用场景 @@ -34,6 +40,14 @@ public class LinkedHashMap transient LinkedHashMap.Entry tail; + //构造函数如下, + public LinkedHashMap(int initialCapacity, + float loadFactor, + boolean accessOrder) { + super(initialCapacity, loadFactor); + this.accessOrder = accessOrder; + } + } ``` @@ -41,21 +55,9 @@ public class LinkedHashMap ## 用LinkedHashMap实现LRU -构造函数如下 +构造函数中 accessOrder 参数是控制LinkedHashMap 访问顺序,默认为插入顺序(false), true 代表访问顺序。 -``` -public LinkedHashMap(int initialCapacity, - float loadFactor, - boolean accessOrder) { - super(initialCapacity, loadFactor); - this.accessOrder = accessOrder; - } -``` - -accessOrder 是访问顺序,默认为插入顺序(false), true 代表访问顺序。 - - -访问顺序的意思是,当有一个entry被访问以后,这个entry就被移动到链表的表尾。 这个特性非常适合 LRU 缓存 (最近最少使用) ; +访问顺序的意思是,当有一个entry被访问以后,这个entry就被移动到链表的表尾。 这个特性非常适合 LRU 缓存 (最近最少使用) ; 插入逻辑,运行自定义删除最老entry的逻辑 diff --git a/9 Algorithms Job Interview/4 数值问题.md b/9 Algorithms Job Interview/4 数值问题.md index 558598d..224bffc 100644 --- a/9 Algorithms Job Interview/4 数值问题.md +++ b/9 Algorithms Job Interview/4 数值问题.md @@ -10,10 +10,24 @@ 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 +思路:这是等差数列求和公式, 1+2+3.......+N =(n+1)n/2 + 分析: 1. 不能使用循环,那就用递归 2. 递归需要终止递归的条件判断语句,这里也不能用if,想其他办法,可以使用 &&逻辑与 运算符(在n>0条件满足是,才会指向后面的递归语句 +``` +int (n){ + int sum=0; + (n>0) && sum=n+factorial(n-1) + return sum; +} +``` + + +## 大数阶乘(factorial) + + ``` int factorial(n){ int sum=0; @@ -23,6 +37,8 @@ int factorial(n){ ``` + + ## 整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 @@ -79,13 +95,16 @@ tmp[i] = tmp[i]>=0 ? tmp[i] : tmp[i]+16; ## ipv4 转 int -比如: 10.67.81.35 , 转为int 为 +比如: 127.0.0.1 , 转为int 为 (01111111 00000000 00000000 00000001) 思路: + ``` -代码 +int toInt(){ + +} ``` 那么,int 转 ipv4 如何解呢?