小米Git
来源:互联网 发布:c语言输入多组数据 编辑:程序博客网 时间:2024/06/02 13:04
题目要求:
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
这道题看上去有点复杂,我也是读了好几遍题目才明白什么意思。其实就是一道树的遍历,两个index分别到根节点0的路径进行对比,找到离根节点最近的相同结点。由于给的情景的git版本更新,也就意味着肯定都是能到根节点的。
代码如下:
import java.util.*;public class Solution { public int getSplitNode(String[] matrix, int indexA, int indexB) { int l1 = matrix.length; int l2 = matrix[0].length(); char[][] M = new char[l1][l2]; for(int i=0; i<l1; i++) { char [] tmp = matrix[i].toCharArray(); for(int j=0; j<l2; j++) { M[i][j] = tmp[j]; } }List<Integer> lA = new ArrayList<>(); List<Integer> lB = new ArrayList<>(); lA = DFS(M, indexA); lB = DFS(M, indexB); int l=0, res=0; if(lA.size()>lB.size()) l = lB.size(); else l = lA.size(); //输出路径中最后一个相同结点 for(int i=0; i<l; i++) { if(lA.get(i)==lB.get(i)) res = lA.get(i); } return res; } //DFS深搜 public List<Integer> DFS(char[][] m, int index) { boolean[] visited = new boolean[m.length]; visited[0] = true; Stack<Integer> s = new Stack<>(); s.push(0); List<Integer> res = new ArrayList<>(); res.add(0); while(s.peek()!=index) { boolean findnext = false; int p = s.peek(); for(int i=0; i<m.length; i++) { if(m[p][i]=='1' && !visited[i]) { p = i; s.push(i); res.add(i); findnext = true; visited[i] = true; break; } } if(!findnext) { s.pop(); res.remove(res.size()-1); } } return res; }}这里我用了DFS深搜算法,由于确定能从根节点找到两个index,所以我就有恃无恐的搜啊搜啊,直到找到index,使得s,peek()==index,这时我就可以把这条路径送回到主函数了。两个都找完之后,把两条路径进行对比,要的是最近分割点,所以就是从头开始对比,一直到最后一个相等的被记录下来,整个for循环结束了,我的res也就找到了。
0 0
- 小米 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米笔试题-小米Git
- 2016小米-小米Git-Java
- 算法题-小米Git
- 算法: 小米Git
- [编程题]小米git
- 小米git笔试题
- [小米面试题]小米Git
- 牛客网---2016---小米Git
- 小米Git问题-学习笔记
- SPOJ ADAQUEUEAda and Queue
- 大二下
- 初识Apache CXF
- 实现垂直居中
- ECShop数据库操作类
- 小米Git
- 网络编程-UDP和TCP
- LeetCode-Easy部分标签为LinkedList 141Linked List Cycle
- [LeetCode]7. Reverse Integer
- 大话设计模式-----(十一)享元模式、解释器模式、访问者模式
- golang学习笔记之赋值
- Terminal折腾记
- Cocos2dx实现注册和登录功能
- AVL树C++实现(end)