设计可以变更的缓存结构:
思路:
设计结构 map---储存对应的位置 + 双向链表---维持优先级
还有size的限制 ----
如果超过个数限制 ---则将头节点删除 并 从中找到map对应的记录(因为节点中含有map中的key)
将新加入节点连在双向链表后面即可~
代码实现:
设计的缓存结构:
注意:
map 中 存值 具体和数值类型有关
map 中 存放 基础类型 则就是具体的值
存放 自定义类型 基本就只存放地址 不会直接存放值 不太可能~
(once fail ----baidu )
给定一个字符串公式 ,返回公式的计算结果:
思路1 (没有小括号的情况) :
将符号和数字均压入同一个栈中
每次压入一个数字和一个符号
若 符号是+ 或者- 则直接压入即可
若符号是* / 则弹出 栈中数字和当前数字进行计算之后 再将结果压入
最后 栈 中所有数字均只有 + - 直接计算即可
考虑2 :有这样的函数 :
f(num) 表示从字符串str的第num位置开始计算 如果遇到右括号则直接停止,返回结果
否则直到str末尾计算 再返回结果即可
解法 :当遇到左括号的时候就开始调用子过程
等子过程将计算值返回时则 继续计算 再返回全局返回值
所以 其实函数返回结果应该是两个:1 计算到哪个位置 2 f(.)计算的返回值
代码实现:
pre :收集数字
如果一直是数字 那就一直读入收集
如果不是左括号和数字(=-/*) 则都分别放入
如果遇到左括号---递归---调用子过程
举例说明核心代码:
跳表(难度大):
能够实现key-vlue其中key 也是有序的 但底层不是红黑树 同样时间复杂度O(logn)
redis底层结构也是跳表 是一种变体
底层原理:
key对应的层数是由随机函数生成(生成结果要不为1 要不为0)
在一个已有的跳表中加入一个新的数字 则如何去找位置?
每次均是从最上面开始查找 而观察分布 发现最下边的层次点数最多 越往上越少
因而时间复杂度比较小
具体代码实现:
注意:下一个比当前的要大 则就往下走 否则往右走
节点结构:
观察列表内容: