华为OD机试 - 查找一个有向网络的头节点和尾节点(Java & JS & Python & C & C++)
warning:
这篇文章距离上次修改已过186天,其中的内容可能已经有所变动。
在有向图中,头节点是入度为0的节点,尾节点是出度为0的节点。
以下是针对不同编程语言的解决方案:
- Java:
import java.util.*;
public class Solution {
/**
* 获取头节点和尾节点
* @param graph 图的邻接表表示
* @return 头节点和尾节点数组
*/
public int[] getHeadAndTailNodes(List<List<Integer>> graph) {
int[] degrees = new int[graph.size()];
boolean[] isHead = new boolean[graph.size()];
boolean[] isTail = new boolean[graph.size()];
// 计算每个节点的度
for (int i = 0; i < graph.size(); i++) {
for (int neighbor : graph.get(i)) {
degrees[neighbor]++;
}
}
// 标记头节点和尾节点
for (int i = 0; i < graph.size(); i++) {
if (degrees[i] == 0) {
isHead[i] = true;
}
if (graph.get(i).isEmpty()) {
isTail[i] = true;
}
}
// 统计头节点和尾节点的数量
int headCount = 0, tailCount = 0;
for (int i = 0; i < isHead.length; i++) {
if (isHead[i]) {
headCount++;
}
if (isTail[i]) {
tailCount++;
}
}
// 不存在头节点或尾节点的情况
if (headCount == 0 || tailCount == 0) {
return new int[]{-1, -1};
}
// 寻找唯一的头节点和尾节点
int headNode = -1, tailNode = -1;
for (int i = 0; i < isHead.length; i++) {
if (isHead[i]) {
if (headNode == -1) {
headNode = i;
} else {
headNode = -1; // 不唯一
break;
}
}
if (isTail[i]) {
if (tailNode == -1) {
tailNode = i;
} else {
tailNode = -1; // 不唯一
break;
}
}
}
return new int[]{headNode, tailNode};
}
}
- JavaScript:
/**
* @param {number[][]} graph
* @return {number[]}
*/
var getHeadAndTailNodes = function(graph) {
let degrees = new Array(graph.length).fill(0);
let isHead = new Array(graph.length).fill(false);
let isTail = new Array(graph.length).fill(false);
// 计算每个节点的度
for (let i = 0; i < graph.length; i++) {
for (let neighbor of graph[i]) {
degrees[neighbor]++;
}
}
//
评论已关闭