小米Git

参开文献: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);
			}
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值