2019年最新總結,阿里,騰訊,百度,美團,頭條等技術面試題目(一)

1.1.1 如何實現一個高效的單向鏈表逆序輸出?

出題人:阿里巴巴出題專家:昀龍/阿里雲彈性人工智能負責人node

參考答案:下面是其中一種寫法,也能夠有不一樣的寫法,好比遞歸等。供參考。python

typedef struct node{
    int           data;
    struct node*  next;
    node(int d):data(d), next(NULL){}
}node;

void reverse(node* head)
{
    if(NULL == head || NULL == head->next){
        return;
    }
    
    node* prev=NULL;
    node* pcur=head->next;
    node* next;
    
    while(pcur!=NULL){
        if(pcur->next==NULL){
            pcur->next=prev;
            break;
        }
        next=pcur->next;
        pcur->next=prev;
        prev=pcur;
        pcur=next;
    }
    
    head->next=pcur;
    node*tmp=head->next;
    while(tmp!=NULL){
        cout<<tmp->data<<"\t";
        tmp=tmp->next;
    }
}
複製代碼

1.1.2 已知sqrt(2)約等於1.414,要求不用數學庫,求sqrt(2)精確到小數點後10位

出題人:——阿里巴巴出題專家:文景/阿里雲 CDN 資深技術專家c++

參考答案:程序員

  • 考察點

1.基礎算法的靈活應用能力(二分法學過數據結構的同窗都知道,但不必定往這個方向考慮;若是學過數值計算的同窗,應該還要能想到牛頓迭代法並解釋清楚)面試

2.退出條件設計算法

  • 解決辦法
  1. 已知 sqrt(2)約等於 1.414,那麼就能夠在(1.4, 1.5)區間作二分 查找,如: a) high=>1.5 b) low=>1.4 c) mid => (high+low)/2=1.45 d) 1.45*1.45>2 ? high=>1.45 : low => 1.45 e) 循環到 c)緩存

  2. 退出條件 a) 先後兩次的差值的絕對值<=0.0000000001, 則可退出bash

const double EPSINON = 0.0000000001;

double sqrt2( ){
    double low = 1.4, high = 1.5;
    double mid = (low + high) / 2;
    
    while (high – low > EPSINON){
        if (mid*mid < 2){
            high = mid;
        }
        else{
            low = mid;
        }
        mid = (high + low) / 2;
    }
    
    return mid;
}
複製代碼

1.1.3 給定一個二叉搜索樹(BST),找到樹中第 K 小的節點

出題人:阿里巴巴出題專家:文景/阿里雲 CDN 資深技術專家數據結構

參考答案:app

  • 考察點 1.基礎數據結構的理解和編碼能力

2.遞歸使用

5
      / \
     3   6
    / \
   2   4
  /
 1
複製代碼

說明:保證輸入的 K 知足 1<=K<=(節點數目)

樹相關的題目,第一眼就想到遞歸求解,左右子樹分別遍歷。聯想到二叉搜索樹的性質,root 大於左子樹,小於右子樹,若是左子樹的節點數目等於 K-1,那麼 root 就是結果,不然若是左子樹節點數目小於 K-1,那麼結果必然在右子樹,不然就在左子樹。所以在搜索的時候同時返回節點數目,跟 K 作對比,就能得出結果了。

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

class Solution {
    private class ResultType {
    
        boolean found;  // 是否找到
        
        int val;  // 節點數目
        ResultType(boolean found, int val) {
            this.found = found;
            this.val = val;
        }
    }

    public int kthSmallest(TreeNode root, int k) {
        return kthSmallestHelper(root, k).val;
    }

    private ResultType kthSmallestHelper(TreeNode root, int k) {
        if (root == null) {
            return new ResultType(false, 0);
        }

        ResultType left = kthSmallestHelper(root.left, k);

        // 左子樹找到,直接返回
        if (left.found) {
            return new ResultType(true, left.val);
        }

        // 左子樹的節點數目 = K-1,結果爲 root 的值
        if (k - left.val == 1) {
            return new ResultType(true, root.val);
        }

        // 右子樹尋找
        ResultType right = kthSmallestHelper(root.right, k - left.val - 1);
        if (right.found) {
            return new ResultType(true, right.val);
        }

        // 沒找到,返回節點總數
        return new ResultType(false, left.val + 1 + right.val);
    }
}

複製代碼

1.1.4 LRU 緩存機制 設計和實現一個 LRU(最近最少使用)緩存數據結構,使它應該支持一下操做:get 和 put。 get(key) - 若是 key 存在於緩存中,則獲取 key 的 value(老是正數),不然返回 -1。 put(key,value) - 若是 key 不存在,請設置或插入 value。當緩存達到其容量時,它應該在插入新項目以前使最近最少使用的項目做廢。

出題人:文景/阿里雲 CDN 資深技術專家

參考答案:

python版本的:

class LRUCache(object):
    def __init__(self, capacity):
    """ :type capacity: int """
    self.cache = {}
    self.keys = []
    self.capacity = capacity
    
    def visit_key(self, key):
        if key in self.keys:
            self.keys.remove(key)
        self.keys.append(key)
    
    def elim_key(self):
        key = self.keys[0]
        self.keys = self.keys[1:]
        del self.cache[key]
        
    def get(self, key):
        """ :type key: int :rtype: int """
        if not key in self.cache:
            return -1
        self.visit_key(key)
        return self.cache[key]
    
    def put(self, key, value):
        """ :type key: int :type value: int :rtype: void """
        if not key in self.cache:
        if len(self.keys) == self.capacity:
        self.elim_key()
        self.cache[key] = value
        self.visit_key(key)

def main():
    s =
    [["put","put","get","put","get","put","get","get","get"],[[1,1],[2,2],[1],[3,3],[2],[
    4,4],[1],[3],[4]]]
    obj = LRUCache(2)
    l=[]
    for i,c in enumerate(s[0]):
        if(c == "get"):
            l.append(obj.get(s[1][i][0]))
        else:
            obj.put(s[1][i][0], s[1][i][1])
    print(l)

if __name__ == "__main__":
    main()

複製代碼

c++版本的:

class LRUCache{
    public:
        LRUCache(int capacity) {
            cap = capacity;
        }
        
        int get(int key) {
            auto it = m.find(key);
            if (it == m.end()) return -1;
            l.splice(l.begin(), l, it->second);
            return it->second->second;
        }
        
        void set(int key, int value) {
            auto it = m.find(key);
            if (it != m.end()) l.erase(it->second);
            l.push_front(make_pair(key, value));
            m[key] = l.begin();
            if (m.size() > cap) {
                int k = l.rbegin()->first;
                l.pop_back();
                m.erase(k);
            }
        }
}
複製代碼

1.3.5 假如給你一個新產品,你將從哪些方面來保障它的質量?

出題人:阿里巴巴出題專家:晨暉 /阿里雲中間件技術部測試開發專家

參考答案:

能夠從代碼開發、測試保障、線上質量三個方面來保障。

在代碼開發階段,有單元測試、代碼Review、靜態代碼掃描等;

測試保障階段,有功能測試、性能測試、高可用測試、穩定性測試、兼容性測試等;

在線上質量方面,有灰度發佈、緊急回滾、故障演練、線上監控和巡檢等。

下期預告:

1.1.6 MySQL的數據如何恢復到任意時間點?

1.1.7 NFS 和 SMB 是最多見的兩種 NAS(Network Attached Storage)協議,當把一個文件系統同時經過 NFS 和 SMB 協議共享給多個主機訪問時,如下哪些說法是錯誤的

1.1.8 輸入 ping IP 後敲回車,發包前會發生什麼?

1.1.9 請解釋下爲何鹿晗發佈戀情的時候,微博系統會崩潰,如何解決?

1.2.0 現有一批郵件須要發送給訂閱顧客,且有一個集羣(集羣的節點數不定,會動態擴容縮容)來負責具體的郵件發送任務,如何讓系統儘快地完成發送?

小結:

在互聯網邊緣OB數幾年,發現面試是程序員開啓神奇之門的第一步。

小夥近期會和你們一塊兒探討互聯網巨頭們2019最新的面試題。

請你們多多關注小夥,您的關注與點贊是小夥更新的動力。

加小夥QQ更多福利資源等你領取喲,QQ 758810390

相關文章
相關標籤/搜索