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

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

我的思路是,a[0]表示"主队列"的元素个数,a[1~n]对应"从队列"的元素个数,收到指令add就主队列++,收到指令sync就从队列++,这个时候数组a[n]的最小值就是队列元素的可见性。

import java.util.Scanner;

public class Main {
	public static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		int n=sc.nextInt();
		sc.nextLine();
		
		int[] a = new int[n];
		String cmd,num;
		int min;
		
		while(sc.hasNext()) {
			cmd = sc.nextLine();
			
			if(cmd.charAt(0)=='a') {
				a[0]++;
			}else if(cmd.charAt(0)=='s') {
				num = "";
				for(int i=5;i<cmd.length();i++) {
					if(cmd.charAt(i)>='0'&&cmd.charAt(i)<='9') //站长给的测评数据数字后面有空格只好筛掉了
						num+=cmd.charAt(i);
				}
				a[Integer.parseInt(num)]++;
			}else if(cmd.charAt(0)=='q') {
				min = Integer.MAX_VALUE;
				for(int j=0;j<a.length;j++) {
					min = Math.min(min,a[j]);
				}
				System.out.println(min);
			}
		}
	}
}
4 回复 0 转发 0 喜欢 24 阅读
回复 (4)
默认 最新
露米 2026/4/16
把复杂的分布式可见性问题抽象成数组求最小值,这个思路很清晰,代码实现也非常直白易懂。

我也留意到你提到的测评数据空格问题,手动写筛选逻辑确实能稳妥地解决。如果想让解析部分更简洁一点,其实可以尝试用 Scannernext() 或者在解析前加上 trim(),它们能帮你自动处理掉那些多余的空白字符。

现在的逻辑已经很完整了。如果之后遇到查询指令 q 特别频繁的情况,你觉得有没有可能在 addsync 的时候就“顺便”把最小值维护好,而不是每次查询都重新遍历一遍数组?

可以先按现在的节奏继续,如果有了新的优化灵感,欢迎随时分享 🙂
对了,还有一个小细节可以留意下:你在代码里定义的数组长度是 n,但在思路说明里提到了从队列编号是 1~n。如果测试用例里真的出现了第 n 个队列,可能需要把数组大小调整为 n + 1 才能避免越界的小状况,稍微改一下就好~

加油,期待看到你更多的解题思路分享。
0
露米 2026/4/4
把分布式队列的可见性问题转化成“寻找数组最小值”,这个思路抓得很准,代码实现也非常干脆。

我也注意到你特别提到了测评数据里的空格问题,并为此写了专门的筛选逻辑。这种对细节的敏锐观察力在解决算法题时真的很有优势。如果想让代码解析部分更简洁一些,或许可以尝试用 Scannernext() 方法,它会自动跳过空格,能帮你省去不少手动处理的功夫。

现在的逻辑已经很清晰了。如果之后想挑战一下性能优化,可以思考看看:如果查询指令 q 出现的频率非常高,有没有办法在数据更新的同时就“顺便”维护好这个最小值,而不是每次都重新遍历一遍数组呢?

可以先按现在的节奏来,如果有了新灵感,欢迎随时分享 🙂
加油,期待看到你更多的解题思路分享。
0
露米 2026/3/9
把分布式队列的可见性转化成数组求最小值的问题,这个切入点找得很准,代码实现也很干脆。

我也注意到你为了处理数据里的空格,手动写了数字解析的逻辑,这种细致的观察力在编程中特别可贵。如果以后想让代码更清爽一点,可以试着用 Scannernext() 方法,它会自动处理掉空格,或者在解析前用 trim() 预处理一下。

现在的思路已经很棒了。如果之后处理的数据量变得非常大,或者查询指令(q)变得特别频繁,你觉得这种“每次查询都重新遍历求最小值”的方式还有优化的空间吗?我们可以一起交流看看 🙂
比如,是否可以在数据更新的同时同步维护这个最小值?

加油,期待看到你更多的解题思路分享。
0
露米 2026/2/10
用数组最小值来衡量分布式队列的可见性,这个思路很直观,逻辑抓得很准。

我也注意到你在处理 sync 指令时,特意考虑到了测评数据中可能存在的空格问题,这种细心的观察对解题很有帮助。如果之后想让解析数字的部分稍微简洁一点,或许可以尝试用 trim() 方法处理一下。

现在的实现已经很清晰了。如果你想进一步挑战一下,有没有考虑过如果查询指令非常频繁,如何能更快速地拿到这个最小值呢?我们可以一起交流看看 🙂
比如,是否可以在数据更新的同时同步维护这个最小值?这样在查询频繁的情况下,效率可能会更高一些。

加油,期待看到你更多的解题思路分享。
0