(笔试题)小米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
思路:
git只是引入题目的一个背景,其实题目问题是:给一个多叉树,寻找多叉树上任意两点的最近共同父节点。多叉树通过邻接矩阵来表示,节点0表示根节点。
方法:寻找两点间的最近共同父节点,需要从两个节点出发,不断地往上回溯,直到找到最近的共同的父节点。那么我们需要记录每个点的父节点信息,通过该信息可以在某个节点处往上回溯,进而找到父节点。
父节点怎么记录?题目给出的是邻接矩阵,可以将邻接矩阵转为邻接链表,这样从根节点出发,即根节点入栈,然后出栈,先找到与根节点相邻的点,即树的一层(根节点为第0层),记录第二层节点的深度(即根节点+1),父节点(即根节点),然后将第二层的节点入栈,依次出栈,重复上述过程。这样就可以得到所有节点的深度和父节点信息。
代码:
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<vector<int> > adjList(n);
vector<int> parent(n,-);
vector<int> depth(n,);
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
if(matrix[i][j]==''){
adjList[i].push_back(j);
adjList[j].push_back(i);
}
}
}
vector<int> stk;
stk.push_back();
int count=;
// depth[0]=0;
while(!stk.empty() && count<n){
int node=stk.back();
stk.pop_back();
for(int k=;k<adjList[node].size();k++){
int v=adjList[node][k];
if(parent[v]!=-)
continue;
parent[v]=node;
depth[v]=depth[node]+;
stk.push_back(v);
count++;
}
}
int a=indexA;
int b=indexB;
while(depth[a]>depth[b])
a=parent[a];
while(depth[a]<depth[b])
b=parent[b];
while(a!=b){
a=parent[a];
b=parent[b];
}
return a;
}
};
(笔试题)小米Git的更多相关文章
- 笔试面试题-小米Git
题目描述: git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常 ...
- 剑指Offer——小米+小红书笔试题+知识点总结
剑指Offer--小米+小红书笔试题+知识点总结 情景回顾 时间:2016.9.23 19:00-21:00 2016.9.24 15:00-17:00 地点:山东省网络环境智能计算技术重点实验室 事 ...
- 2015小米暑期实习笔试题_风口的猪-中国牛市(dp)
风口之下.猪都能飞.当今中国股市牛市,真可谓"错过等七年". 给你一个回想历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i] ...
- ThoughtWorks西邮暑期特训营 -- JavaScript在线笔试题
ThoughtWorks 公司在西邮正式开办的只教女生前端开发的女子卓越实验室已经几个月过去了,这次计划于暑期在西邮内部开展面向所有性别所有专业的前端培训. 具体官方安排请戳:ThoughtWorks ...
- 算法笔试题整理——升级蓄水池 && 字符串数字表达式计算值 && 求旅游完所有景点需要的最少天数 && 宝箱怪
1. 小米笔试题——升级蓄水池 题目描述: 在米兔生活的二维世界中,建造蓄水池非常简单. 一个蓄水池可以用n个坐标轴上的非负整数表示,代表区间为[0-n]范围内宽度为1的墙壁的高度. 如下图1,黑色部 ...
- 对Thoughtworks的有趣笔试题实践
记得2014年在网上看到Thoughtworks的一道笔试题,当时觉得挺有意思,但是没动手去写.这几天又在网上看到了,于是我抽了一点时间写了下,我把程序运行的结果跟网上的答案对了一下,应该是对的,但是 ...
- 从阿里巴巴笔试题看Java加载顺序
一.阿里巴巴笔试题: public class T implements Cloneable { public static int k = 0; public static T t1 = new T ...
- 我设计的ASP.NET笔试题,你会多少呢
本笔试题考查范围包括面向对象基础.HTML.CSS.JS.EF.jQuery.SQL.编码思想.算法等范围. 第1题:接口和抽象类有何区别? 第2题:静态方法和实例方法有何区别? 第3题:什么是多态? ...
- C#经典笔试题-获取字符串中相同的字符以及其个数
public Dictionary<char,int> GetStrSameAs(string str){ //将字符串转换成一个字符数组. char[] charArray=str.To ...
随机推荐
- linux 文件处理大杂烩
1.对文件某行进行统计排序 awk '{ printf "%-40s \n",$4}' /var/log/yum.log | sort | uniq -c | sort -nk ...
- Linux rescue
适用场景: 当误操作修改系统启动文件/etc/fstab, /etc/rc.d/rc.sysinit时,就会造成系统启动时读取磁盘或初始化环境失败,导致linux无法正常启动,此时就可以借助Linux ...
- MySQL的冷备份和热备份概念理解(转)
一.冷备份(off, 慢, 时间点上恢复) 冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库.冷备份是将关键性文件拷贝到另外位置的一种说法.对于备份数据库信息而言,冷备 ...
- ORA-00918:未明确定义列解决
ORA-00918:未明确定义列解决 问题:ORA-00918:未明确定义列 eg. select name, name from a left join b on a.flag = b. ...
- BitmapFactory.Options.inSampleSize 的使用方法
BitmapFactory.decodeFile(imageFile); 用BitmapFactory解码一张图片时.有时会遇到该错误. 这往往是因为图片过大造成的. 要想正常使用,则须要分配更少的内 ...
- 33.NET对加密和解密的支持
散列运算 mscorlib.dll下的System.Security.Cryptography下: 抽象类HashAlgorithm 抽象类MD5 MD5CryptoSer ...
- Office Word等双击空白处的“隐藏的模块中的编译错误:MTW5”解决
Microsoft Visual Basic for Applications 隐藏的模块中的编译错误:MTW5. ...
- 高手写的“iOS 的多核编程和内存管理”
原文地址:http://anxonli.iteye.com/blog/1097777 多核运算 在iOS中concurrency编程的框架就是GCD(Grand Central Dispatch), ...
- KJHttp框架使用讲解
摘要 本文原创,转载请注明地址:http://kymjs.com/code/2015/05/12/01写给那些在用.想用.还没有用过KJFrame的朋友. KJFrameForAndroid总共分为四 ...
- ExtJs 起始日期 结束日期 验证
Ext.apply(Ext.form.VTypes,{ daterange: function(val, field) { var date = field.parseDate(val); // We ...