點贊再看,養成習慣!
前言
達摩院的第二面過了一個星期(5月8日)纔來,期間我的應聘狀態也從原來阿里雲算法改成了達摩院基礎研發,這是偏算法落地的崗位,核心是研發。經過這一段找實習的過程,真切感受到算法研究並不是我喜歡的方向,我還是更喜歡將算法作爲錦上添花的技術來優化產品。
正文
當時同時有好幾家公司在面試,所以這一面沒有進行記錄,不過能夠明顯感受到這一面的面試官是個大BOSS。唯一能找到的記錄就是在線編程題了,是系統設計題,如下:
- 在線編程題:LRUCache的設計與實現
兩種方法實現,推薦面試用調庫的方法(實際上我也是用的這個方法),這可以很快地實現想法,向面試官說明自己的思路。只不過面試官肯定要問有序字典這個數據結構是如何實現的,所以平時練習的時候還得把第二種方法做出來,就明白OrderedDict簡單實現的底層原理了。
# 調庫,用有序字典實現
# from collections import OrderedDict
# class LRUCache(OrderedDict):
# def __init__(self, capacity):
# """
# :type capacity: int
# """
# self.capacity = capacity
# def get(self, key):
# """
# :type key: int
# :rtype: int
# """
# if key not in self:
# return - 1
# self.move_to_end(key)
# return self[key]
# def put(self, key, value):
# """
# :type key: int
# :type value: int
# :rtype: void
# """
# if key in self:
# self.move_to_end(key)
# self[key] = value
# if len(self) > self.capacity:
# self.popitem(last=False)
# 雙鏈表+字典來實現
class DLinkedNode():
def __init__(self):
self.key = 0
self.value = 0
self.prev = None
self.next = None
class LRUCache():
def _add_node(self, node):
"""
Always add the new node right after head.
"""
node.prev = self.head
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
def _remove_node(self, node):
"""
Remove an existing node from the linked list.
"""
prev = node.prev
new = node.next
prev.next = new
new.prev = prev
def _move_to_head(self, node):
"""
Move certain node in between to the head.
"""
self._remove_node(node)
self._add_node(node)
def _pop_tail(self):
"""
Pop the current tail.
"""
res = self.tail.prev
self._remove_node(res)
return res
def __init__(self, capacity):
"""
:type capacity: int
"""
self.cache = {}
self.size = 0
self.capacity = capacity
self.head, self.tail = DLinkedNode(), DLinkedNode()
self.head.next = self.tail
self.tail.prev = self.head
def get(self, key):
"""
:type key: int
:rtype: int
"""
node = self.cache.get(key, None)
if not node:
return -1
# move the accessed node to the head;
self._move_to_head(node)
return node.value
def put(self, key, value):
"""
:type key: int
:type value: int
:rtype: void
"""
node = self.cache.get(key)
if not node:
newNode = DLinkedNode()
newNode.key = key
newNode.value = value
self.cache[key] = newNode
self._add_node(newNode)
self.size += 1
if self.size > self.capacity:
# pop the tail
tail = self._pop_tail()
del self.cache[tail.key]
self.size -= 1
else:
# update the value.
node.value = value
self._move_to_head(node)
結語
這一面我表現地比較淡然了,因爲這面之前我已經拿到了中科院XX所的offer,心裏踏實很多。而且,提問環節向面試官稍微提了下offer的事情,面試官還表示願意幫我加快下進度,然鵝,我沒想到de是這麼快! 上午才面完,下午就來約晚上的交叉面…
童鞋們,讓小編聽見你們的聲音,點贊評論,一起加油。