当前位置: 首页 > news >正文

网站快照倒退国际网站平台有哪些

网站快照倒退,国际网站平台有哪些,没有网站可以备案吗,网站前台需求文档(一)问题描述 146. LRU 缓存 - 力扣(LeetCode)146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类: * LRUCache(int capacity)…

(一)问题描述

146. LRU 缓存 - 力扣(LeetCode)146. LRU 缓存 - 请你设计并实现一个满足  LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类: * LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 * int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。 * void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。 示例:输入["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"][[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]输出[null, null, null, 1, null, -1, null, -1, 3, 4]解释LRUCache lRUCache = new LRUCache(2);lRUCache.put(1, 1); // 缓存是 {1=1}lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}lRUCache.get(1); // 返回 1lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}lRUCache.get(2); // 返回 -1 (未找到)lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}lRUCache.get(1); // 返回 -1 (未找到)lRUCache.get(3); // 返回 3lRUCache.get(4); // 返回 4 提示: * 1 <= capacity <= 3000 * 0 <= key <= 10000 * 0 <= value <= 105 * 最多调用 2 * 105 次 get 和 puthttps://leetcode.cn/problems/lru-cache/description/?envType=study-plan-v2&envId=top-100-liked

请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。

实现 LRUCache 类:

  • LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

示例:

输入
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1);    // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2);    // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1);    // 返回 -1 (未找到)
lRUCache.get(3);    // 返回 3
lRUCache.get(4);    // 返回 4

 

提示:

  • 1 <= capacity <= 3000
  • 0 <= key <= 10000
  • 0 <= value <= 105
  • 最多调用 2 * 105 次 get 和 put

(二)解决思路

        这道题以方便要用哈希表方便查找,另一方面可以用双向链表来记录节点被使用的顺序:新增的元素和刚刚被修改了value的元素放在头部,如果插入时节点数量超过了capacity,就把尾部元素删掉。使用双向链表和使用单向链表相比便于操作尾部元素。

 方法一:使用现成的数据结构

        python和java中都有存在哈希功能的链表结构,python是OrderedDict,java是LinkedHashMap。但是直接用已有的数据结构一般不会符合面试官的要求,和库函数的使用一样,有些数据结构的使用也要慎重,像这种直接用数据结构的情况明显是跳过了问题想要考察的重点

        下面的代码来自Leetcode官方题解。 

class LRUCache extends LinkedHashMap<Integer, Integer>{private int capacity;public LRUCache(int capacity) {super(capacity, 0.75F, true);this.capacity = capacity;}public int get(int key) {return super.getOrDefault(key, -1);}public void put(int key, int value) {super.put(key, value);}@Overrideprotected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {return size() > capacity; }
}

方法二:哈希表+双向链表 

         面试官会更希望我们自己实现哈希表+双向链表的功能。思路就是本节开头的那段话。链表的定义其实就是节点类的定义。为了方便插入和删除头尾元素,可以创建虚拟头尾节点head和tail。

class LRUCache {//双向链表class DLinkedNode{public int key;public int value;public DLinkedNode prev;public DLinkedNode next;public DLinkedNode(){};public DLinkedNode(int _key,int _value){key=_key;value=_value;}}//哈希表private HashMap<Integer,DLinkedNode> cache=new HashMap<>();//size是现在链表的长度,capacity是允许的最大节点数private int size;private int capacity;//虚拟头尾节点private DLinkedNode head,tail;public LRUCache(int capacity) {//大部分时候访问类自身的成员变量不需要this//但是如果方法里有某个局部变量和成员变量名字相同,就需要用this区分this.size=0;this.capacity=capacity;head=new DLinkedNode();tail=new DLinkedNode();head.next=tail;tail.prev=head;}public int get(int key) {//判断map里是否存在key,如果不存在的话会返回nullDLinkedNode node=cache.get(key);if(node==null){return -1;}else{//刚刚访问过的节点移动到头部moveToHead(node);return node.value;}}public void put(int key, int value) {//判断map里是否存在key,如果不存在的话会返回null//如果只是map存或者更新value的话不需要判断,但这里还涉及链表的变化,所以要判断DLinkedNode node=cache.get(key);if(node==null){//新节点加入DLinkedNode newNode=new DLinkedNode(key,value);//新节点放在链表头putToHead(newNode);//节点放进mapcache.put(key,newNode);size++;if(size>capacity){//超出容量,删除尾部节点int removeKey=removeFromTail();cache.remove(removeKey);}}else{//已经存在的节点更新值node.value=value;//放在节点头moveToHead(node);}}//节点的移动/添加就是指针指向的变化public void moveToHead(DLinkedNode node){node.prev.next=node.next;node.next.prev=node.prev;node.next=head.next;head.next.prev=node;head.next=node;node.prev=head;}public void putToHead(DLinkedNode newNode){head.next.prev=newNode;newNode.next=head.next;head.next=newNode;newNode.prev=head;}public int removeFromTail(){DLinkedNode node=tail.prev;node.next.prev=node.prev;node.prev.next=node.next;return node.key;}
}

 注:大部分时候访问类自身的成员变量不需要this,但是如果方法里有某个局部变量和成员变量名字相同,就需要用this区分。

http://www.ds6.com.cn/news/20404.html

相关文章:

  • 辽宁鞍山网站建设公司凡客建站
  • 做网站都需要什么资料百度自动驾驶技术
  • 大连大型网站制作公司百度网站提交入口网址
  • 做1个自己的贷款网站网络营销方式有哪些
  • 本地网站建设电话品牌营销策略分析论文
  • 网站是怎么做新手引导seo搜索优化公司报价
  • 如何仿做网站sem外包
  • WordPress20w文章seo领导屋
  • 怎样制作一个个人网站百度竞价多少钱一个点击
  • 如何做网站备案腾讯nba新闻
  • wp系统网站如何做seo自媒体135的网站是多少
  • 长沙网络营销群潍坊百度快速排名优化
  • 一元购物网站怎么做搜索引擎优化方法与技巧
  • 网站关键词重复北京seo案例
  • 做移动网站优化排名安徽网站优化
  • 做网站公司哪家餐饮营销方案
  • 做网站需要哪些步骤网站改版公司哪家好
  • 标准网站建设哪家好合肥网络推广平台
  • 做网站如何防止被黑国外友链买卖平台
  • 浦东做网站公司网络营销推广
  • 电子商务网站开发与设计建个人网站的详细步骤
  • 新疆建设厅招投标网站小时seo百度关键词点击器
  • 个人空间网站模板必应搜索推广
  • 详情页在线设计网站推荐最近国际时事热点事件
  • 移动端网站电商平台有哪些?
  • 邹城网站建设v556百度集团官网
  • 网站需要证件网站的营销推广
  • 龙华做棋牌网站建设找哪家效益快社群营销的十大案例
  • 戴尔网站建设国内新闻摘抄2022年
  • 微擎pc网站开发seo搜索引擎优化费用