2026年美团CTO技术面试题与解答.docxVIP

  • 0
  • 0
  • 约5.68千字
  • 约 16页
  • 2026-02-12 发布于福建
  • 举报

第PAGE页共NUMPAGES页

2026年美团CTO技术面试题与解答

一、编程题(共3题,每题20分,总分60分)

题目1:实现LRU缓存机制(20分)

问题描述:

设计一个LRU(LeastRecentlyUsed)缓存机制,支持get和put操作。缓存容量为固定值capacity。当访问一个键时,如果键存在,则返回其值,并将该键标记为最近使用;如果键不存在,返回-1。当插入新键值对时,如果缓存已满,则删除最久未使用的键值对。

要求:

-使用链表和哈希表实现,时间复杂度为O(1)。

-请提供完整代码实现,并说明选择的数据结构及其原因。

答案与解析:

代码实现(Python):

python

classListNode:

def__init__(self,key=0,value=0,prev=None,next=None):

self.key=key

self.value=value

self.prev=prev

self.next=next

classLRUCache:

def__init__(self,capacity:int):

self.capacity=capacity

self.cache={}

self.head=ListNode()

self.tail=ListNode()

self.head.next=self.tail

self.tail.prev=self.head

def_add_node(self,node:ListNode):

Alwaysaddthenewnoderightafterhead.

node.prev=self.head

node.next=self.head.next

self.head.next.prev=node

self.head.next=node

def_remove_node(self,node:ListNode):

Removeanexistingnodefromthelinkedlist.

prev_node=node.prev

next_node=node.next

prev_node.next=next_node

next_node.prev=prev_node

def_move_to_head(self,node:ListNode):

Movecertainnodeinbetweentothehead.

self._remove_node(node)

self._add_node(node)

def_pop_tail(self)-ListNode:

Popthecurrenttail.

res=self.tail.prev

self._remove_node(res)

returnres

defget(self,key:int)-int:

node=self.cache.get(key,None)

ifnotnode:

return-1

Movetheaccessednodetothehead;

self._move_to_head(node)

returnnode.value

defput(self,key:int,value:int)-None:

node=self.cache.get(key)

ifnotnode:

newNode=ListNode(key,value)

self.cache[key]=newNode

self._add_node(newNode)

iflen(self.cache)self.capacity:

Popthetail

tail=self._pop_tail()

delself.cache[tail.key]

else:

Updatethevalue.

node.value=value

self._move_to_head(node)

解析:

-数据结构选择:

-双向链表:用于记录访问顺序,头节点表示最近访问,尾节点表示最久未访问。链表操作(插入、删除)为O(1)。

-哈希表:用于快速查找键对应的链表节点,查找时间为O(1)。

-实现逻辑:

1.get操作:通过哈希表快速定位节点,若存在则移动到链表头部(标记为最近使用),返回值;若不存在返回-1。

2.put操作:若键已存在,更新值并移动到头部;若不存在,创建新节点并插入头部,若超出容量则删除链表尾部节点(最久未使用)。

-性能分析:

-get和put操作均通过哈希表和链表实现,

文档评论(0)

1亿VIP精品文档

相关文档