git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
2017-02-19 19:05
1701 查看
// ConsoleApplication10.cpp : 定义控制台应用程序的入口点。
//
//
#include "stdafx.h" #include <iostream> #include <vector> using namespace std; 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) { if (indexA >= matrix.size() || indexB >= matrix.size()) { return 0; } vector<int> depth; vector<int> parent; breadTraverl(matrix, depth, parent); int p=0; //如果同一深度,父节点相同,则分割点为父节点 //同一深度,父节点不同,寻找父节点的父节点 //不同深度,从深度高的往上过滤,每次过滤的时候判断是否达到低的节点的深度;没有之前,要判断低的节点是否是深的节点的父节点 if (depth[indexA] == depth[indexB]) { int a = indexA; int b = indexB; while (parent[a]!=parent[b]) { a = parent[a]; b = parent[b]; } p= parent[a]; } else { int a = indexA;//a对应的节点深 int b = indexB; bool flag = false;//未找到分割点 if (depth[indexA] < depth[indexB]) { a = indexB; b = indexA; } while (depth[a]!=depth[b])//当节点a和节点b不在同一个深度 { if (parent[a] == b) { p = b; flag = true; break; } else { --a; } } if (flag == false) { int a = indexA; int b = indexB; while (parent[a] != parent[b]) { a = parent[a]; b = parent[b]; } p = parent[a]; } } return p; } //广度优先遍历图 void breadTraverl(vector<string> matrix, vector<int> &depth, vector<int> &parent) { //visited数组,如何visited[i]为false,则被访问过 vector<bool> visited; // vector<int> depth; // vector<int> parent; for (int i = 0;i < matrix.size();++i) { visited.push_back(true); depth.push_back(0); parent.push_back(0); } cout << "V_" << 0 << " "; visited[0] = false; depth[0] = 0; parent[0] = 0;//根节点的本身设置为自己 for (int i = 0;i < matrix.size();++i) { // cout << "matrix[0].length():" << matrix[0].length() << endl; for (int j = 0;j < matrix[0].length();++j) { //注意:此处的matrix[i][j]应该为'1'而不是1 if ((matrix[i][j] == '1')&& (visited[j] == true)) { cout << "matrix[" << i << "]"<<"["<<j<<"]:" << matrix[i][j] << " "; cout << "visited["<<j<<"]:" << visited[j] << endl; cout << "V_" << j << " "; parent[j] = i; depth[j] = depth[i] + 1; visited[j] = false; } } } cout << endl; for (int i = 0;i < matrix.size();i++) { cout << i << ":"; cout << "parent:" << parent[i] << " "; cout << "depth:" << depth[i] << endl; } } }; int main() { Solution so; vector<string> matrix; string str1 = "01011"; string str2 = "10100"; string str3 = "01000"; string str4 = "10000"; string str5 = "10000"; matrix.push_back(str1); matrix.push_back(str2); matrix.push_back(str3); matrix.push_back(str4); matrix.push_back(str5); cout<<"结果:"<<so.getSplitNode(matrix, 0, 2); cout << endl; return 0; }
相关文章推荐
- 小米笔试题:给一个多叉树,寻找多叉树上任意两点的最近共同父节点
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- 计算git树上任意两点的最近分割点。
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- 最近距离 已知平面上的若干点的位置,存入一个List中。现在需要计算所有这些点中, 距离最近的两个点间的最小距离。请补全缺失的代码。
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
- 有一个长度不大于40的字符串,已知其中包含两个字符‘A',求处于这两个字符之间的字符的个数,并把这些字符依次打印出来
- 已知某公司总人数为W,平均年龄为Y岁(每年3月末计算,同时每年3月初入职新人),假设每年离职率为x,x>0&&x<1,每年保持所有员工总数不变进行招聘,新员工平均年龄21岁。 从今年3月末开始,请实现一个算法,可以计算出第N年后公司员工的平均年龄。(最后结果向上取整)。
- 二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。 对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 小易想知道最多可以放多少块蛋糕在网格盒子里。 输入描述: 每组数组包含网格长宽W,
- Linux系统中,有两个文件file1和file2,每个文件的每一行都是#UUID,其中的每一UUID表示一个号。要找出在file1中有而在file2中没有的UUID,使用cat,sort,uniq三个命令如何实现
- 字符串替换空格:请实现一个函数,把字符数组中的每个空格替换成“%20”
- 字符串替换空格: 请实现一个函数,把字符数组中的每个空格替换成“%20”。 例如输入“we are happy.”,则输出“we are happy.”
- 字符串替换空格: 请实现一个函数,把字符数组中的每个空格替换成“%20”。 例如输入“we are happy.”,则输出“we%20are%20happy.”。
- 【小米笔试题】实现一个算法,确定一个字符串的所有字符是否全部不同
- 从文件读取包含数字和字母字符串,统计每个字符出现的次数,将次数输出到另外一个文件
- List的All方法使用问题:我用List1的All方法来确保List1的所有每个数组元素中是否包含Arr1中的任意元素,这个部分很难实现。 因为,没有一个数组中是否包含另一个数组中的任意元素这个功能