【newCoder】2016校招真题在线编程 小米Git
2018-03-16 14:40
337 查看
题目描述
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树的根节点。)示例1
输入
[01011,10100,01000,10000,10000],1,2
输出
1
题目思路 多叉树寻找最近公共父节点问题 解题思路 从矩阵构造出father数组,father数组保存每个节点的父节点。 记录从根节点到带求节点A和B的路径。 比较路径,找到最近的公共节点。
具体代码
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<int>parents(n,-1); int noParents = n-1;//0节点为根节点 for(int i=0;i<n;i++) { if(matrix[0][i]=='1') { --noParents; parents[i]=0; } } while(noParents) { for(int i=1;i<n;i++) { if(parents[i]==-1) { for(int j=0;j<n;j++) { if(matrix[i][j]=='1'&&parents[j]!=-1) { parents[i]=j; --noParents; break; } } } } } vector<bool>visited(n,false); do { visited[indexA]=true; indexA= parents[indexA]; }while(indexA!=-1); do { if(visited[indexB]==true) { return indexB; } indexB= parents[indexB]; }while(indexB!=-1); return 0; } };
相关文章推荐
- 【newCoder】2016校招真题在线编程 风口的猪-中国牛市
- 【newCoder】2016校招真题在线编程 懂二进制
- 【newCoder】2016校招真题在线编程 二分查找
- 2016校招真题在线编程 懂二进制
- 2016校招真题解析(一)小米git
- 2016校招真题-小米Git(找最近双亲)
- 2017校招真题在线编程 异或
- 2016联想校招软件开发类在线笔试真题
- 2016校招真题编程练习——微信红包(腾讯)
- 2017校招真题在线编程之素对数
- 2017校招真题在线编程
- 牛客网2016校招真题在线编程之懂二进制
- 2016联想校招图形图像软件工程师在线笔试真题
- 牛客网2016校招真题在线编程之最大差值
- 笔试真题解析 2016 SYDZ 校招在线笔试题
- 2017校招真题编程训练--句子反转 倒置字符串
- 华为2017年8月30日校招编程真题2-自定义的26进制和十进制之间互相转换
- 2016小米校招笔试题
- 2016去哪儿校招研发编程三道
- 牛客网2017校招真题编程练习--7.藏宝图