m0_50862190 2021-01-26 13:04 采纳率: 33.3%
浏览 330
已结题

面试中遇到个算法题请教,

现在有个工作流系统,包含了 nodes 和 edeges(点和边),运行这个工作流时需要按照顺序
来执行,举例:

 

上图中的执行顺序就是:输入->文本拆分->输出。现在简化输入的内容,每个节点只有节点
id,边只有两个 id,代表从 A->B 有一个先后执行的关系。请完成以下方法:
class NodeMap {
    public int[] findOrder(int nodeCount, int[][] edges) {

    }
}
其中 nodeCount 代表 node 数量(编号从 0 至 N-1),edges 代表了所有的边,输出为 node 执
行的顺序。

样例:
输入参数是:nodeCount=4, edges=[[0,1],[0,2],[3,0],[2,1]]
输出是:[3,0,2,1]
样例说明:

  • 写回答

2条回答 默认 最新

  • lin351550660 2021-01-27 10:55
    关注
    import cn.hutool.json.JSONUtil;
    
    import java.util.*;
    
    public class Test {
    
        public static void main(String[] args) {
            int[][] a =  new int[4][2];
            a[0] = new int[]{0,1};
            a[1] = new int[]{0,2};
            a[2] = new int[]{3,0};
            a[3] = new int[]{2,1};
            System.out.println(JSONUtil.toJsonStr(findOrder(4,a)));
        }
    
        public static int[] findOrder(int nodeCount, int[][] edges) {
    
            //先找到起点
            Map<Integer,Integer> head = new HashMap<>();
            for (int[] edge:edges) {
                //线起点个数
                Integer num = head.get(edge[0]);
                if (num == null){
                    head.put(edge[0],1);
                } else {
                    head.put(edge[0],num+1);
                }
            }
            Integer start = null;
            for (Integer key:head.keySet()) {
                if (head.get(key) == 1){
                    start = key;
                }
            }
            //遍历线段后得到的路径
            List<Integer> path = new ArrayList<>();
            path = buildPath(path,edges,start);
    
            //[3,0,0,1,0,2,2,1]
            //逆序合并相同节点
            List<String> list = new ArrayList<>();
            int index = 0;
            for (int j = path.size() -1;j>= 0 ; j--  ) {
                if (!list.contains(path.get(j)+"")){
                    list.add(path.get(j)+"");
                }
            }
            int k = 0;
            int[] ret = new int[nodeCount];
            for (int j = list.size() -1;j>= 0 ; j--  ) {
                ret[k++] = Integer.valueOf(list.get(j));
            }
            return ret;
        }
    
        private static List<Integer> buildPath(List<Integer> path, int[][] edges, Integer start) {
            //当前起点
            for (int i = 0; i <edges.length ;i++) {
                int[] edge = edges[i];
                if (edge[0] == start){
                    path.add(edge[0]);
                    path.add(edge[1]);
                    buildPath(path,edges,edge[1]);
                }
            }
            return path;
        }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月21日
  • 已采纳回答 8月13日

悬赏问题

  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信