题目描述:
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树:
根据上面的输入,可以很容易构造出如下git树:

解题思路:
(1)分别求出给定节点的前驱节点,一直找到根节点0为止。这里有个约定就是节点的前驱节点下标是小于当前节点的,这是我的理解,不知道有没有错误。因此,节点2的前驱节点(包括自己)分别为[2,1,0],节点1的前驱节点分别为[1,0]。

(2)求出两个节点的前驱节点的第一个公共节点,就是要求的两点的最近分割点。比如[2,1,0]和[1,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) {if(indexA==indexB)return indexA;int nodeNum=matrix.size();vector<int> indexAForwardNode;       vector<int> indexBForwardNode;//查找节点A的前驱节点int nearestForwardNodeA=indexA;while(nearestForwardNodeA>=0){indexAForwardNode.push_back(nearestForwardNodeA);int i=nearestForwardNodeA-1;for(;i>=0;--i){if(matrix[nearestForwardNodeA][i]=='1'){nearestForwardNodeA=i;break;}}if(i==-1)//已经找到了根节点break;  }//查找节点B的前驱节点int nearestForwardNodeB=indexB;while(nearestForwardNodeB>=0){indexBForwardNode.push_back(nearestForwardNodeB);int i=nearestForwardNodeB-1;for(;i>=0;--i){if(matrix[nearestForwardNodeB][i]=='1'){nearestForwardNodeB=i;break;}}if(i==-1)//已经找到了根节点break;  }//寻找最近f分割点stack<int> stackForwordNodeA;stack<int> stackForwordNodeB;for(int i=0;i<indexAForwardNode.size();++i)stackForwordNodeA.push(indexAForwardNode[i]);for(int i=0;i<indexBForwardNode.size();++i)stackForwordNodeB.push(indexBForwardNode[i]);    int commonIndex=stackForwordNodeA.size();while(stackForwordNodeA.top()==stackForwordNodeB.top()){stackForwordNodeA.pop();stackForwordNodeB.pop();--commonIndex;if(stackForwordNodeA.empty()||stackForwordNodeB.empty())break;}return indexAForwardNode[commonIndex];}
};

问题:
上面的实现可以通过上面给定的测试案例。但是在牛客网通不过下面的测试案例。

同一个节点的最近分割点不就是自己吗?但是牛客网给的答案却不是。请知道的网友留言解答,谢谢。

小米 Git(在线笔试)相关推荐

  1. 【小米2018-09-20在线笔试】小米大礼包

    题目描述 小米之家是成人糖果店.里面有很多便宜,好用,好玩的产品.中秋节快到了:小米之家想给米粉们准备一些固定金额大礼包.对于给定的一个金额,需要判断能不能用不同种产品(一种产品在礼包最多出现一次)组 ...

  2. 小米暑期实习在线笔试2015-04-25

    周五晚上参加了小米的全国在线笔试,使用的是百一测评,不得不说,这是我参加过的最不靠谱的在线笔试. 先来描述题目,再来吐槽,在线笔试就是三个必做题和两个附加题. 必做题是三个算法题, 第一题是判断两个十 ...

  3. [Java基础]Scanner的使用(秋招在线笔试高频使用)版本:Java™ Platform Standard Ed. 8...

    本节目讨论的Scanner为Java™ Platform Standard Ed. 8版本,请来自未来的Java同胞确认自己所处的Java版本时间线,未来的Scanner说不定已经改变了很多 最近参加 ...

  4. 2015年9月百度前端在线笔试

    我的空间www.cumt.top 刚结束百度前端的在线笔试,感觉被虐了 一道系统题,三道编程题,js写的云里雾里 第一道系统题:写出资源管理器的数据结构,和功能接口 想了好一会儿,决定数据结构用jso ...

  5. 编程笔试(解析及代码实现):国内各大银行(招商银行/浦发银行等)在线笔试常见题目(猴子吃桃/字符串逆序输出/一段话输出字的个数/单词大小转换等)及其代码实现(Java/Python/C#等)之详细攻略

    编程笔试(解析及代码实现):国内各大银行(招商银行/浦发银行等)在线笔试常见题目(猴子吃桃/字符串逆序输出/一段话输出字的个数/单词大小转换等)及其代码实现(Java/Python/C#等)之详细攻略 ...

  6. 滴滴2017在线笔试有感

    呵呵 刚才参加完了 滴滴2017的在线笔试. 又一次被虐..班上很多人都在耍算法,这样算法 那样算法.其实今天看他的 题目 也就是 数据结构的基础知识, 没有多高深的算法..当然这是一个小生的 匹夫之 ...

  7. 【CVTE Web后台开发实习生2019.12.05在线笔试】总结

    本次在线笔试题型:23道选择题(单选和不定项选).2道在线算法编程题.1道问答题. 选择题 主要考了一下知识点: 数组的二分查找: 线程间通信机制(notify.wait().yield()等): 图 ...

  8. Python、Java 在线笔试

    1. Python 循环输入输出交互 Python在线笔试琐碎 求两个整数 A+B 的和. while True:try:(n, m) = (int(x) for x in raw_input().s ...

  9. 2020-09-13 滴滴-2021校招在线笔试-DE数据开发试卷

    2020-09-13 滴滴-2021校招在线笔试-DE数据开发试卷 1. D星群岛 题目: D星群岛由n个小岛组成.为了加强小岛居民之间的交流,头目决定启动一个造桥工程,将全部n个岛连接到一起.由于受 ...

  10. cvte在线笔试 android,CVTE在线笔试

    确切是昨天,感谢之前 solo找到wangsi 的内推,于是很快在线笔试的通知发到了邮箱.纪录一下这次笔试的考点. 1.二叉树遍历 { 先序:根左右 中序:左根右 后序:左右根 } 2.Linux操作 ...

最新文章

  1. 终于有人把中医“数字化”了 | 极客视频
  2. rds本地库到rds恢复_华为云RDS备份导入到本地
  3. MATLAB保存数据为dat格式,將matlab中數據保存為txt或dat格式
  4. python入门基础系列八_Python 入门系列 —— 21. dict 的介绍
  5. 背包——01背包Bone Collector(hdu2602)
  6. SQL Server 2016 开发版将免费
  7. 一步步实现SDDC-vRNI加速实现安全微分段
  8. mongodb mac安装_在Mac OS X上安装MongoDB
  9. c# 多线程界面卡顿_C#多线程解决界面卡死问题的完美解决方案
  10. 互联网金融的前世、今生和未来-系列三(今生):一场跨界的战争
  11. 37、我的C#学习笔记3
  12. Express 项目启动
  13. 联想小新一键恢复小孔_【联想自带一键重装系统】联想自带一键重装小孔_联想自带一键恢复...
  14. 谷歌SEO专业术语指南
  15. Science:已“死亡”的细菌仍能感知来自环境的信息
  16. 海报的5种处理方式,让你的照片更吸睛
  17. Android开发免费短信验证码SDK。
  18. 群体智能算法之蚁群算法初探(一)
  19. 程序题智能批改系统需求分析
  20. 样本均值和样本方差的无偏性证明、正态分布样本方差的方差

热门文章

  1. PHP如何获取txt中的文字
  2. Android 图标上面添加提醒(一)使用Canvas绘制
  3. 完美解决eWebEditor编辑器按钮失效 IE8、9无法使用方法
  4. Directx11教程(33) 纹理映射(3)
  5. Linux下的字符界面扫雷游戏
  6. 11 个让你吃惊的 Linux 终端命令-转
  7. 圣地亚哥分校 计算机,加州大学圣地亚哥分校计算机怎么样?
  8. html标题代码字号,HTML 标题
  9. android+去掉飞行模式,在Android中关闭飞行模式
  10. bum报文_Vxlan学习笔记——原理