
问题:你需要回答在某个时刻,队列中有多少个元素具有可见性
方案:跟踪每个副节点已经同步到主节点队列的元素数量,并找出所有副节点中同步到的最少元素数量,这个数量即为所有副节点都已经同步的元素数量。
解析:只需要总数量数据的建立和维护,从而进行抽象操作处理
(1)初始化
维护主节点队列的长度 mainQueueSize,初始为0
对于每个副节点,维护一个数组 followerSync,记录每个副节点已经同步到主节点队列的元素数量,初始均为0
(2)处理操作
- add element:
主节点队列长度 mainQueueSize 增加1
- sync follower_id:
对应副节点的同步数量 followerSync[follower_id] 增加1,但不得超过 mainQueueSize!!
- query:
找出所有副节点中已经同步的最少元素数量 minSync
输出 minSync,即当前队列中具有可见性的元素数量。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
// index[i] 表示第 i 个节点已同步的最新元素下标,初始为 -1
int[] index = new int[n];
Arrays.fill(index, -1);
while (sc.hasNextLine()) {
String line = sc.nextLine();
String[] tokens = line.split(" ");
String s = tokens[0];
if ("query".equals(s)) {
int min = Integer.MAX_VALUE;
for (int i : index) {
if (min > i) min = i;
}
System.out.println(min + 1);
} else if ("add".equals(s)) {
// 添加元素,主节点的索引加一
int element = Integer.parseInt(tokens[1]);
index[0]++;
} else if ("sync".equals(s)) {
// 同步操作,只有当副节点的索引小于主节点时才能同步
int followerId = Integer.parseInt(tokens[1]);
if (followerId >= 1 && followerId < n) {
if (index[followerId] < index[0]) {
index[followerId]++;
}
}
}
}
}
}