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
分別倒序尋找兩個節點與根結點(0節點)的連通路。
將兩條通路進行匹配,尋找最近的分割點(兩條通路中第乙個相同的點)。
int findclosestseperatingpoint(char **gittree, int n, int pointa, int pointb)
void findpath(char **gittree, int *path, int & pathlen, int point)
pathlen++;
path[pathlen-1] = j;
i = j;
}}int match(int patha, int pathb, int pathlenofa, int pathlenofb)}}
return 0;
}
中間將尋找與根結點的通路**和
匹配兩條通路的最近分割點**封裝起來了。
//
// main.cpp
// findclosestseperatingpoint
//// created by jiajie zhuo on 2017/4/2.
//#include using namespace std;
int findclosestseperatingpoint(char **gittree, int n, int pointa, int pointb);
void findpath(char **gittree, int *path, int & pathlen, int point);
int match(int patha, int pathb, int pathlenofa, int pathlenofb);
int main(int argc, const char * argv)
}cout << "please enter the two point a and b: ";
cin >> pointa >> pointb;
closestseperatingpoint = findclosestseperatingpoint(gittree, n, pointa, pointb);
cout << "the closestseperatingpoint is " << closestseperatingpoint << endl;
for (int i = 0; i < n; ++i)
delete gittree;
return 0;
}
注:這裡已知git樹的節點數。
其中的path可以使用vector,新增元素和匹配時都會方便很多。
因為path中的元素都是倒序排列的,所以最後的match()匹配方法增加效率。
這是一道比較典型的
多叉樹的查詢問題,考查了對二維陣列的操作以及樹的鄰接矩陣的搜尋。
小公尺麵試題 手機分身,電話號碼隱藏。
小公尺麵試題 手機分身,號碼隱藏。0 9分別對應zero,one,two,nine 為保證手機撥號安全性,撥號後,存為對應的字串,並打亂順序,保證安全性。現在給定乙個字串,求最小的數字組合 例 twoone otnwoe 1212 分析 關鍵字搜尋 第一次第二次 第三次0 zero z1 one o...
golang 面試題(七)小公尺麵試題,字串
給出乙個字串s 僅含有小寫英文本母和括號 請你按照從括號內到外的順序,逐層反轉每對匹配括號中的字串,並返回最終的結果。注意,您的結果中 不應 包含任何括號。示例1 輸入 s abcd 輸出 dcba 示例2 輸入 s u love i 輸出 iloveu s uevoli iloveu 示例3 輸入...
小公尺麵試題 朋友圈問題 並查集
假如已知有n個人和m對好友關係 存於數字r 如果兩個人是直接或間接的好友 好友的好友的好友.則認為他們屬於同乙個朋友圈,請寫出程式求出這n個人裡一共有多少朋友圈。例如 n 5,m 3,r 表示有5個人,1和2是好友,2和3是好友,4和5是好友。則1,2,3屬於乙個朋友圈,4,5屬於另乙個朋友圈,結果...