问题描述
AB 实验作为推荐策略迭代的有力工具,经常会有新的实验上线,以及一些无效策略的下线。在这些迭代过程中,难免会遇到意料之外的情况,导致部分服务崩溃而不可用。为了避免系统的全面崩溃,工程师们会添加监控报警,确保第一时间通知到值班同学进行处理。
小M同学刚刚开始负责线上报警的值班工作。很快,她就收到了第一条报警日志。在报警的时间范围内,小M同学收到了 NN 名用户的反馈,每位用户编号为 11 到 NN。小M同学查询线上实验后,统计了用户命中实验的列表,其中第 ii 位用户命中了 kiki 个实验,第 jj 个实验的编号为 ai,jai,j。
这些用户的反馈并不完全是由于一个问题造成的,因此小M同学需要对这些问题进行分类。根据先前的经验,小M同学会进行 QQ 次询问尝试对问题进行分类,第 ii 次询问会给出一个序列 bi,1,bi,2,…,bi,cibi,1,bi,2,…,bi,ci,cici 表示第 ii 次查询的实验数量。当 bi,j>0bi,j>0 时表示命中实验 ∣bi,j∣∣bi,j∣,否则表示未命中实验 ∣bi,j∣∣bi,j∣。小M同学需要得到符合这些条件的用户数。例如,序列 1, -2, 3 表示命中实验 1, 3 且未命中实验 2 的用户数量。
小M同学初来乍到,希望你能帮她解决这个问题。
思路分析如下
为了解决这个问题,我们需要确定有多少用户符合每个查询中指定的条件。每个查询指定了一组实验,这些实验应该被用户命中或不被命中。
1.解析输入:
n 是用户数量;
m 是实验数量;
q 是查询数量;
arrayN 是一个二维数组,其中每一行代表一个用户,列代表他们命中的实验;
arrayQ 是一个二维数组,其中每一行代表一个查询,列代表实验的条件。
2.处理每个查询:
对于每个查询,我们需要检查有多少用户满足查询中指定的条件。
如果用户满足查询中的所有条件,则该用户被计入符合条件的用户数。
3.实现细节:
我们将使用嵌套循环来遍历每个查询和每个用户。
对于每个用户,我们将检查他们是否满足当前查询中的所有条件。
如果用户满足所有条件,我们将增加该查询的计数。
代码实现如下
import java.util.*;
public class Main {
public static List<Integer> solution(int n, int m, int q, int[][] arrayN, int[][] arrayQ) {
List<Integer> result = new ArrayList<>();
// 处理每个查询
for (int i = 0; i < q; i++) {
int[] query = arrayQ[i];
int count = 0;
// 检查每个用户
for (int j = 0; j < n; j++) {
int[] userExperiments = arrayN[j];
boolean matches = true;
// 检查用户是否匹配查询条件
for (int k = 1; k <= query[0]; k++) {
int experiment = Math.abs(query[k]);
boolean shouldHit = query[k] > 0;
boolean userHits = false;
// 检查用户是否命中实验
for (int l = 1; l <= userExperiments[0]; l++) {
if (userExperiments[l] == experiment) {
userHits = true;
break;
}
}
// 如果用户不匹配条件,跳出循环
if (userHits != shouldHit) {
matches = false;
break;
}
}
// 如果用户匹配所有条件,增加计数
if (matches) {
count++;
}
}
// 将当前查询的计数添加到结果中
result.add(count);
}
return result;
}
public static void main(String[] args) {
// 测试用例
System.out.println(solution(3, 3, 3, new int[][]{{2,1,2},{2,2,3},{2,1,3}},
new int[][]{{2,1,-2},{2,2,-3},{2,3,-1}}).equals(Arrays.asList(1, 1, 1)));
System.out.println(solution(5, 4, 2, new int[][]{{3,1,2,3},{1,2},{2,1,4},{3,2,3,4},{2,1,3}},
new int[][]{{3,1,-4,2},{2,-1,-3}}).equals(Arrays.asList(1, 1)));
System.out.println(solution(4, 3, 2, new int[][]{{1,1},{2,2,3},{1,3},{2,1,2}},
new int[][]{{1,-3},{2,2,3}}).equals(Arrays.asList(2, 1)));
}
}