首页 > 其他分享 >面试手撕优化

面试手撕优化

时间:2024-08-07 19:49:32浏览次数:6  
标签:head ListNode int next 链表 面试 key 优化

LRU 缓存

 1 /*
 2     每次get一个key有两种情况,要么链表里面没有这个key那么可以直接返回-1,
 3     如果链表里面有这个key,我们需要把查到的这个节点给移到链表头部,
 4     对于put操作,我们直接通过调用get返回结果:
 5     如果返回不是-1,说明链表里面已有key,那么我们的get函数会给他排到链表前面去。
 6     如果返回-1,说明链表里面没有key,那么我们需要插入这个key,分两种情况:
 7     如果容量满了,就删除最后一个节点再把新的key加进来作为链表头结点
 8     否则直接加入当前的key到链表头结点
 9 */
10 class LRUCache {
11 public:
12     int cap;
13     list<int>st;//使用C++自带的双向链表list
14     unordered_map<int,list<int>::iterator>mp;//key需要映射到链表元素的迭代器
15     unordered_map<int,int>mp1;//保存key-value键值对,方便查询元素value
16     LRUCache(int capacity) {
17         cap=capacity;
18     }
19     int get(int key) {
20         if(mp.count(key)){
21             auto it=mp[key];
22             //splice(const_iterator pos, list& other, const_iterator it)表示把结点it移到other链表的pos位置之前
23             st.splice(st.begin(),st,it);
24             return mp1[key];
25         }
26         else return -1;
27     }
28     void put(int key, int value) {
29         if(get(key)!=-1){  
30             mp1[key]=value;
31         }
32         else{
33             if(mp.size()==cap){ //如果容量满了,就删除最后一个再把新的key加进来作为链表头结点
34                 int x=st.back();
35                 mp.erase(x);
36                 st.pop_back();
37                 st.push_front(key);
38                 mp1[key]=value;
39                 auto it=st.begin();
40                 mp[key]=it;
41             }
42             else{  //否则直接加入当前的key到链表头结点
43                 st.push_front(key);
44                 mp1[key]=value;
45                 auto it=st.begin();
46                 mp[key]=it;
47             }
48         }
49     }
50 };

 删除链表的倒数第 N 个结点

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode() : val(0), next(nullptr) {}
 7  *     ListNode(int x) : val(x), next(nullptr) {}
 8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 9  * };
10  */
11 class Solution {
12 public:
13     ListNode* removeNthFromEnd(ListNode* head, int n) {
14         ListNode *p = head, *q = head, *pre = head;
15         if (!p->next) {
16             delete(head);
17             head = nullptr;
18             return head;
19         }
20         int cnt = 0;
21         while (q) {
22             if (cnt < n) {
23                 cnt++;
24                 q = q->next;
25             }
26             else {
27                 q = q->next;
28                 pre = p;
29                 p = p->next;
30             }
31         }
32         if (pre == p) {
33             p = p->next;
34             delete(head);
35             head = p;
36             return head;
37         }
38         pre->next = p->next;
39         delete(p);
40         return head;
41     }
42 };

 

               

标签:head,ListNode,int,next,链表,面试,key,优化
From: https://www.cnblogs.com/ccsu-kid/p/18347789

相关文章

  • readis部分面试问题(面试篇)
    主从同步原理作为判断依据:ReplicationId:简称replid,是数据集的标记,replid一致则是同一数据集。每个master都有唯一的replid,slave则会继承master节点的replidoffset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slav......
  • 137文章解读与程序——基于遗传算法优化神经网络的时间序列预测 GA-BP已提供下载资源
    ......
  • 136程序——源程序-CPO-VMD【24年新算法】冠豪猪优化算法(CPO)优化VMD变分模态分解---
    ......
  • 矩阵获客时代,云微客布局SEO优化,提升企业搜索流量
    矩阵这个词大家应该都不是第一次听了,毕竟现在互联网时代,想要在线上获客,矩阵就绕不过去的。现在,短视频已经成为了当下年轻人获取信息的重要途径,而对于商企来说,布局短视频矩阵不仅是线上获客、获取流量的关键,也是企业品牌宣传的新渠道。企业做短视频,一定要做矩阵,不然在内容过......
  • iOS app启动优化
    app的启动阶段可分为main函数调用前和main函数调用后,分别都做了些什么呢1、pre-main阶段   1)加载应用的可执行文件(自身App的所有.o文件的集合)  2)加载动态链接器dyld(dynamicloader,是一个专门用来加载动态链接库的库)  3)dyld递归加载应用所有依赖的动态链接库dyli......
  • 数据结构——线段树优化 学习笔记
    数据结构——线段树优化学习笔记比较基础,因此讲的很快。我们主要关注单点修改、区间查询的线段树,这是应用最广泛的。线段树问题我们以LOJ的这道题为例,例题:LOJ#130.树状数组1:单点修改,区间查询。洛谷上面也有类似的题:P3374【模板】树状数组1。因为洛谷的题的数据范......
  • 优化办公流程,你值得拥有的PDF编辑器推荐
    当我们需要修改、调整或是直接在PDF文件上“动刀”时,一款好用的PDF编辑器简直就是救星啊!今天,我就从咱们职场办公人的角度出发,跟大家分享三款我在编辑PDF文字方面亲测过,觉得相当给力的工具。一、福昕PDF编辑器网址:https://editor.foxitsoftware.cn/这家伙简直就是PDF编辑界......
  • Java面试题及答案(就业教程)
    最新常见Java开发面试题、面试常问Java面试题整理(附白话答案)一、Java基础部分面试题1.Java面向对象的三个特征封装:对象只需要选择性的对外公开一些属性和行为。继承:子对象可以继承父对象的属性和行为,并且可以在其之上进行修改以适合更特殊的场景需求。多态:允许不同类的对象......
  • 260道网络安全工程师面试题(附答案)_网安面试题 戳我拿源文档
    2024年过去了一大半,先来灵魂三连问,年初定的目标完成多少了?薪资涨了吗?女朋友找到了吗?​好了,不扎大家的心了,接下来进入正文。由于我之前写了不少网络安全技术相关的文章和回答,不少读者朋友知道我是从事网络安全相关的工作,于是经常有人私信问我:我刚入门网络安全,该怎么学?......
  • 高频Java面试题集锦(含答案)
    第一章-Java篇1、Object中有哪些方法   难度系数:⭐protectedObjectclone()--->创建并返回此对象的一个副本。booleanequals(Objectobj)--->指示某个其他对象是否与此对象“相等protectedvoidfinalize()--->当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾......