筆試面試題-小米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

思路:

將輸入例子的鄰接矩陣畫成圖,畫的比較丑,大家將就着看吧。

0<-1<-2

  <-3

  <-4

結合題目描述,得出關鍵信息兩點。

1、1節點和2節點的分割點是1->0和2->1->0兩條路徑的第一個重合點。可以將此題轉化為求兩條有序鏈表的公共節點。

2、路徑上的節點值一定是單調遞減的。

所以我們可以從值較大的節點B出發,依次前往父節點B‘(有且僅有一個,根節點沒有),每到達一個父節點就和另一個節點值A進行比較,如果相等,說明找到了分割點,如果B'小於A,則停止當前路徑,從A繼續出發找父節點。

關於父節點的尋找:設B所在行rowB,從matrix[rowB][rowB-1]開始向左遍歷,遇到的第一個1就是父節點的編號。

 1 public int getSplitNode(String[] matrix, int indexA, int indexB) {
 2     if (indexA < 0 || indexB < 0 || matrix == null)
 3         return -1;
 4     if (indexA == indexB)
 5         return indexA;
 6     if (indexA < indexB) {
 7         for (int i = indexB - 1; i >= 0; i--) {
 8            if(matrix[indexB].charAt(i) == '1') {
 9             return getSplitNode(matrix, indexA, i);
10            }
11         }
12     }
13     return getSplitNode(matrix, indexB, indexA);
14  }

 

PS:代碼並沒有通過牛客網的檢查,提示如下,運行錯誤:請檢查是否存在數組越界非法訪問,野指針亂訪問,空指針亂訪問等情況。但我覺得思路應該沒什么問題,還請前輩指教。


免責聲明!

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



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