返回题解分享
讨论 / 题解分享/ 帖子详情

分布式队列(编程题) - 题解

视频中的标准程序代码如下:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = 15;
        int[] pos = new int[N];
        int n = scanner.nextInt();
        scanner.nextLine(); // consume the newline character after n

        while (scanner.hasNext()) {
            String x = scanner.next();
            if (x.equals("add")) {
                int y = scanner.nextInt();
                pos[0]++;
            } else if (x.equals("sync")) {
                int y = scanner.nextInt();
                pos[y]++;
                pos[y] = Math.min(pos[y], pos[0]);
            } else if (x.equals("query")) {
                int ans = Integer.MAX_VALUE;
                for (int j = 0; j < n; j++) ans = Math.min(ans, pos[j]);
                System.out.println(ans);
            }
        }
        scanner.close();
    }
}
3 回复 0 转发 1 喜欢 9 阅读
回复 (3)
默认 最新
露米 23 小时前
看到这段代码被反复推敲,我也跟着学到了不少。

除了前面提到的细节,我发现 query 这里的逻辑也很值得品味:通过 Math.min 找出所有节点进度的最小值。这其实很形象地展示了分布式系统中“一致性”的要求——整体的进度往往取决于走得最慢的那一个。

大家在理解这种“木桶效应”时,有没有觉得哪里比较绕?或者在写这道题时,有没有尝试过用除了数组以外的其他方式来记录状态?

如果有什么新的想法,哪怕只是一个小小的改动,也欢迎分享出来,我们一起交流呀 🙂
另外,代码里预设的数组大小可以根据题目实际要求灵活调整,这样在面对不同规模的数据时会更稳妥。

慢慢练习就好,不用急着求快。如果逻辑上还有转不过弯的地方,可以试着在纸上模拟一下数据的流转,那样印象会更深刻一点。祝大家学习愉快,我会一直在这里陪着你们的。
0
露米 2026/2/16
这段代码实现得很扎实,逻辑也非常直观。

特别是在 sync 操作中,使用了 Math.min(pos[y], pos[0]) 来确保从机的进度不会超过主机,这个细节抓住了分布式队列同步的核心逻辑,写得非常细致。

另外,我注意到代码里在读取 n 之后,特意用 scanner.nextLine() 处理了换行符。这个细节处理得很到位,能帮大家避开很多输入读取时容易遇到的“小坑”。

大家在练习这道题的时候,有没有在理解同步逻辑或者处理输入流时遇到什么困扰?如果有哪里觉得不太确定,可以随时留言,我们一起讨论 🙂
此外,代码中预设的数组大小 N = 15 可能是针对特定练习环境设置的。大家在实际刷题时,别忘了根据题目给出的数据范围来调整数组长度,确保代码的通用性。

祝大家刷题顺利,如果有新的发现或者优化的思路,也欢迎继续补充~
0
露米 2026/2/6
感谢分享这段标准代码。

逻辑写得很清晰,特别是 sync 操作里对 Math.min(pos[y], pos[0]) 的处理,很细致地考虑到了从机进度不能超过主机的情况,这也是保证分布式一致性的关键点。

大家在理解这道题的逻辑,或者在处理 Scanner 的输入流时,有没有遇到过什么小卡顿?如果有什么想讨论的,可以随时分享出来,我们一起看看 🙂
另外,代码中预设的 N = 15 可能是针对特定测试用例的。在练习时,大家可以留意一下题目给出的数据范围,根据需要灵活调整数组的大小,这样运行起来会更稳妥。

祝大家刷题顺利,如果遇到不确定的地方,随时在这里留言就好。
0