leetcode练习题-997. 找到小镇的法官

本文介绍了一个算法问题,即如何在给定的信任关系中找到小镇的秘密法官。通过分析一系列的信任对,算法判断是否存在一个个体,其不信任任何人但被所有人信任,从而确定其是否为秘密法官。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 在一个小镇里,按从 1 到 N 标记了 N 个人。传言称,这些人中有一个是小镇上的秘密法官。
 * <p>
 * 如果小镇的法官真的存在,那么:
 * <p>
 * 小镇的法官不相信任何人。
 * 每个人(除了小镇法官外)都信任小镇的法官。
 * 只有一个人同时满足属性 1 和属性 2 。
 * 给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示标记为 a 的人信任标记为 b 的人。
 * <p>
 * 如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的标记。否则,返回 -1。
 * <p>
 * 示例 1:
 * <p>
 * 输入:N = 2, trust = [[1,2]]
 * 输出:2
 * 示例 2:
 * <p>
 * 输入:N = 3, trust = [[1,3],[2,3]]
 * 输出:3
 * 示例 3:
 * <p>
 * 输入:N = 3, trust = [[1,3],[2,3],[3,1]]
 * 输出:-1
 * 示例 4:
 * <p>
 * 输入:N = 3, trust = [[1,2],[2,3]]
 * 输出:-1
 * 示例 5:
 * <p>
 * 输入:N = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
 * 输出:3
 * <p>
 * https://leetcode-cn.com/problems/find-the-town-judge/
 */
class Solution {
    /**
     * 出度为0,并且入度为N-1
     *
     * @param N
     * @param trust
     * @return
     */
    public int findJudge(int N, int[][] trust) {
        int[] outDegress = new int[N + 1];
        int[] inDegress = new int[N + 1];
        for (int i = 0; i < trust.length; i++) {
            int first = trust[i][0];
            int second = trust[i][1];
            outDegress[first]++;
            inDegress[second]++;
        }
        for (int i = 1; i <= N; i++) {
            if (outDegress[i] == 0 && inDegress[i] == N - 1) {
                return i;
            }
        }
        return -1;
    }
}

public class MainClass {
    public static int[] stringToIntegerArray(String input) {
        input = input.trim();
        input = input.substring(1, input.length() - 1);
        if (input.length() == 0) {
            return new int[0];
        }
        String[] parts = input.split(",");
        int[] output = new int[parts.length];
        for (int index = 0; index < parts.length; index++) {
            String part = parts[index].trim();
            output[index] = Integer.parseInt(part);
        }
        return output;
    }

    public static int[][] stringToInt2dArray(String input) {
        JsonArray jsonArray = JsonArray.readFrom(input);
        if (jsonArray.size() == 0) {
            return new int[0][0];
        }
        int[][] arr = new int[jsonArray.size()][];
        for (int i = 0; i < arr.length; i++) {
            JsonArray cols = jsonArray.get(i).asArray();
            arr[i] = stringToIntegerArray(cols.toString());
        }
        return arr;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = in.readLine()) != null) {
            int N = Integer.parseInt(line);
            line = in.readLine();
            int[][] trust = stringToInt2dArray(line);
            int ret = new Solution().findJudge(N, trust);
            String out = String.valueOf(ret);
            System.out.print(out);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值