参开文献:http://blog.youkuaiyun.com/native_lee/article/details/52567128
思路参考上文
Java代码
public class Main {
/**
* 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
*/
public static void main(String[] args) {
String[] array = new String[] { "0001", "0001", "0001", "1110" };
int a = getSplitNode(array, 3, 2);
System.out.println(a);
}
/**
* 返回git树上两点的最近分割点
*
* @param matrix
* 接邻矩阵,表示git树,matrix[i][j] == '1'
* 当且仅当git树中第i个和第j个节点有连接,节点0为git树的跟节点
* @param indexA
* 节点A的index
* @param indexB
* 节点B的index
* @return 整型
*/
public static int getSplitNode(String[] matrix, int indexA, int indexB) {
String[][] Array = YouXu(matrix);
int[] flag = new int[matrix.length];
FindFather(Array, indexA, flag);
int i=FindFather(Array, indexB, flag);
return i;
}
private static int FindFather(String[][] array, int index, int[] flag) {
int dex = 0;
if (flag[index] == 0) {
flag[index] = 1;
//寻找节点的 父节点轨迹并不是简单的for循环,(错误:若[i][indexA]为1则为父节点)
//正确做法是:第0行为根节点,依次查找[i][indexA],第一个为1 的为父节点,然后转到第indexA行为第二层节点,
for (int j = 0; j < array.length; j++) {
if ("1".equals(array[j][index])) {
dex = FindFather(array, j, flag);
break;
}
}
} else {
dex = index;//当查找父节点的过程中 此flag已经为1,则这就是他的父节点
}
return dex;
}
private static String[][] YouXu(String[] matrix) {
String[][] intArr = new String[matrix.length][matrix[0].length()];
for (int i = 0; i < matrix.length; i++) {
char[] cArr = matrix[i].toCharArray();
for (int j = 0; j < cArr.length; j++) {
intArr[i][j] = cArr[j] + "";
}
}
// 有向矩阵
SortArray(intArr, 0);
return intArr;
}
private static void SortArray(String[][] intArr, int r) {
for (int j = 0; j < intArr.length; j++) {
if (intArr[r][j].equals("1")) {
intArr[j][r] = "0";
SortArray(intArr, j);
}
}
}
}