(筆試題)小米Git


題目:

git是一種分布式代碼管理工具,git通過樹的形式記錄文件的更改歷史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程師常常需要尋找兩個分支最近的分割點,即base.假設git 樹是多叉樹,請實現一個算法,計算git樹上任意兩點的最近分割點。 (假設git樹節點數為n,用鄰接矩陣的形式表示git樹:字符串數組matrix包含n個字符串,每個字符串由字符'0'或'1'組成,長度為n。matrix[i][j]=='1'當且僅當git樹種第i個和第j個節點有連接。節點0為git樹的根節點。)

輸入例子:

[01011,10100,01000,10000,10000],1,2

輸出例子:

1

思路:

git只是引入題目的一個背景,其實題目問題是:給一個多叉樹,尋找多叉樹上任意兩點的最近共同父節點。多叉樹通過鄰接矩陣來表示,節點0表示根節點。

方法:尋找兩點間的最近共同父節點,需要從兩個節點出發,不斷地往上回溯,直到找到最近的共同的父節點。那么我們需要記錄每個點的父節點信息,通過該信息可以在某個節點處往上回溯,進而找到父節點。

父節點怎么記錄?題目給出的是鄰接矩陣,可以將鄰接矩陣轉為鄰接鏈表,這樣從根節點出發,即根節點入棧,然后出棧,先找到與根節點相鄰的點,即樹的一層(根節點為第0層),記錄第二層節點的深度(即根節點+1),父節點(即根節點),然后將第二層的節點入棧,依次出棧,重復上述過程。這樣就可以得到所有節點的深度和父節點信息。

代碼:

class Solution {
public:
    /**
     * 返回git樹上兩點的最近分割點
     * 
     * @param matrix 接鄰矩陣,表示git樹,matrix[i][j] == '1' 當且僅當git樹中第i個和第j個節點有連接,節點0為git樹的跟節點
     * @param indexA 節點A的index
     * @param indexB 節點B的index
     * @return 整型
     */
    int getSplitNode(vector<string> matrix, int indexA, int indexB) {
        int n=matrix.size();
    vector<vector<int> > adjList(n);
        vector<int> parent(n,-1);
        vector<int> depth(n,0);
         
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(matrix[i][j]=='1'){
                    adjList[i].push_back(j);
                    adjList[j].push_back(i);
                }
            }
        }
         
        vector<int> stk;
        stk.push_back(0);
        int count=0;
//        depth[0]=0;
        while(!stk.empty() && count<n){
            int node=stk.back();
            stk.pop_back();
            for(int k=0;k<adjList[node].size();k++){
                int v=adjList[node][k];
                if(parent[v]!=-1)
                    continue;
                parent[v]=node;
                depth[v]=depth[node]+1;
                stk.push_back(v);
                count++;
            }
        }
         
        int a=indexA;
        int b=indexB;
        while(depth[a]>depth[b])
            a=parent[a];
        while(depth[a]<depth[b])
            b=parent[b];
        while(a!=b){
            a=parent[a];
            b=parent[b];
        }
        return a;
    }
};
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM