青训营X豆包MarsCode技术训练营 | 豆包MarsCode AI刷题01

115 阅读3分钟

问题描述

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同学初来乍到,希望你能帮她解决这个问题。

image.png

思路分析如下

为了解决这个问题,我们需要确定有多少用户符合每个查询中指定的条件。每个查询指定了一组实验,这些实验应该被用户命中或不被命中。

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)));
    }
}