阿里春招之旅(十)

點贊再看,養成習慣!

前言

達摩院的第二面過了一個星期(5月8日)纔來,期間我的應聘狀態也從原來阿里雲算法改成了達摩院基礎研發,這是偏算法落地的崗位,核心是研發。經過這一段找實習的過程,真切感受到算法研究並不是我喜歡的方向,我還是更喜歡將算法作爲錦上添花的技術來優化產品。

正文

當時同時有好幾家公司在面試,所以這一面沒有進行記錄,不過能夠明顯感受到這一面的面試官是個大BOSS。唯一能找到的記錄就是在線編程題了,是系統設計題,如下:

  1. 在線編程題: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是這麼快! 上午才面完,下午就來約晚上的交叉面…

童鞋們,讓小編聽見你們的聲音,點贊評論,一起加油。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章