题目:

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,-1);vector<int> depth(n,0);for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(matrix[i][j]=='1'){adjList[i].push_back(j);adjList[j].push_back(i);}}}vector<int> stk;stk.push_back(0);int count=0;
//        depth[0]=0;while(!stk.empty() && count<n){int node=stk.back();stk.pop_back();for(int k=0;k<adjList[node].size();k++){int v=adjList[node][k];if(parent[v]!=-1)continue;parent[v]=node;depth[v]=depth[node]+1;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;}
};

 

转载于:https://www.cnblogs.com/AndyJee/p/4477177.html

(笔试题)小米Git相关推荐

  1. 2019 小米校招笔试题 小米大礼包

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

  2. 小米运维部14年校招笔试题A的个人答案

    15年准备实习生面试时答的题,仅供参考 具体题目详见  http://www.tuicool.com/articles/eYRZBr http://noops.me/?p=1154 一.linux基础 ...

  3. 【求职】小米 2018 秋招测试开发工程师笔试题

    小米 2018 秋招测试开发工程师笔试题 一.单选题 1.静态变量static 在不同的实例中地址是否一样?他们储存在什么区域?( ) A. 地址一样,在堆栈区. B. 地址不一样,在堆栈区. C. ...

  4. 【2022小米秋招(2023校招)】软件开发方向 笔试题1——链表反转

    题目: 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表. 输 ...

  5. 2018年腾讯校招和小米校招本人所做笔试题——前端Web开发工程师方向

    本人愚笨,刚开始对笔试题并不是很了解.仅以此两家为学习的地方,待日后希望更好.现在就把这两家的我记录下来的笔试题整理起来.小米的内容在后,有详细的解答! 腾讯:感觉上腾讯的题目是偏难一点的,不亏是鹅厂 ...

  6. 小米校园招聘笔试题--括号智能纠错

    一 问题描述: 二 解题思路: 因为要对括号序列进行插入操作,所以选择链表作为序列的数据结构,在判断括号序列是否合法时,要用到堆栈,所以选择堆栈用以存放左半括号 三 代码: /* This is a ...

  7. 剑指Offer——小米+小红书笔试题+知识点总结

    #剑指Offer--小米+小红书笔试题+知识点总结 ##情景回顾 时间:2016.9.23 19:00-21:00 2016.9.24 15:00-17:00 地点:山东省网络环境智能计算技术重点实验 ...

  8. 前端笔试题面试题记录(下)

    前言 接上篇前端笔试题面试题记录(上).趁清明小长假,把上篇剩下的部分也写一下,因为最近比较忙这篇已经拖了很久了.现在刚刚开始银四了,应该还是有些小伙伴在找工作,时间还不算太晚,希望本篇可以帮到这些小 ...

  9. IC验证笔试题(寒武纪)

    寒武纪笔试题 请简述:定宽数组.动态数组.关联数组和队列四种数据类型的各自特点. 数据类型 物理内存 索引 固定数组 编译时创建,之后不能修改 数字 动态数组 仿真时创建,仿真期间可以改变 数字 队列 ...

最新文章

  1. 程序员每天工作摸鱼俩小时,月薪35K?
  2. 附录5:TensorFlow基础(一)
  3. 【Java 虚拟机原理】栈帧 | 局部变量表 | 操作数栈 | 方法出口 | JVM 指令逐条解析
  4. mysql canal 安装测试_canal安装配置与mysql操作监听,我已经帮你踩过了所有的坑...
  5. JQuery Ajax调用asp.net后台方法
  6. MySQL的启动脚本
  7. 为什么说苏宁必买万达百货
  8. HTML基础教程笔记(HTML5与CSS3基础教程书)
  9. Java六种异常处理的陋习
  10. 基于Mplayer的嵌入式流媒体播放器的设计与实现
  11. Boss直聘怎么写出优秀的简历?
  12. #9733;为什么不要和“穷人”做朋友?
  13. 解决vue项目中prettier、eslint格式冲突问题
  14. (BAT批处理)批处理命令怎么校验文件MD5哈希值?
  15. C++常用STL库详细总结
  16. p2p半分布式开源项目调研:
  17. 印第安纳大学校庆超算,使用下一代 N 卡,速度达 6 千万亿次/秒
  18. [Python]-Wechat工具
  19. Windows terminal 分屏
  20. 如何绕过开机密码开启计算机,win10系统怎么绕过开机密码_win10系统绕过开机密码的两种方法...

热门文章

  1. 《设计模式之禅》学习笔记(一)
  2. Eclipse插件使用links目录的用法
  3. LinkedHashMap
  4. windows下多进程加协程并发模式
  5. 【51NOD1287】加农炮
  6. Linux Bash变量-数值运算与运算符
  7. 页面重新跳转到父类url
  8. spring和mybatis整合进行事务管理
  9. java增强型for循环(三种遍历集合方式)
  10. C# 把特定数字移动到数字前面,其他顺序不变。