LeetCode-in-Java

3433. Count Mentions Per User

Medium

You are given an integer numberOfUsers representing the total number of users and an array events of size n x 3.

Each events[i] can be either of the following two types:

  1. Message Event: ["MESSAGE", "timestampi", "mentions_stringi"]
    • This event indicates that a set of users was mentioned in a message at timestampi.
    • The mentions_stringi string can contain one of the following tokens:
      • id<number>: where <number> is an integer in range [0,numberOfUsers - 1]. There can be multiple ids separated by a single whitespace and may contain duplicates. This can mention even the offline users.
      • ALL: mentions all users.
      • HERE: mentions all online users.
  2. Offline Event: ["OFFLINE", "timestampi", "idi"]
    • This event indicates that the user idi had become offline at timestampi for 60 time units. The user will automatically be online again at time timestampi + 60.

Return an array mentions where mentions[i] represents the number of mentions the user with id i has across all MESSAGE events.

All users are initially online, and if a user goes offline or comes back online, their status change is processed before handling any message event that occurs at the same timestamp.

Note that a user can be mentioned multiple times in a single message event, and each mention should be counted separately.

Example 1:

Input: numberOfUsers = 2, events = [[“MESSAGE”,”10”,”id1 id0”],[“OFFLINE”,”11”,”0”],[“MESSAGE”,”71”,”HERE”]]

Output: [2,2]

Explanation:

Initially, all users are online.

At timestamp 10, id1 and id0 are mentioned. mentions = [1,1]

At timestamp 11, id0 goes offline.

At timestamp 71, id0 comes back online and "HERE" is mentioned. mentions = [2,2]

Example 2:

Input: numberOfUsers = 2, events = [[“MESSAGE”,”10”,”id1 id0”],[“OFFLINE”,”11”,”0”],[“MESSAGE”,”12”,”ALL”]]

Output: [2,2]

Explanation:

Initially, all users are online.

At timestamp 10, id1 and id0 are mentioned. mentions = [1,1]

At timestamp 11, id0 goes offline.

At timestamp 12, "ALL" is mentioned. This includes offline users, so both id0 and id1 are mentioned. mentions = [2,2]

Example 3:

Input: numberOfUsers = 2, events = [[“OFFLINE”,”10”,”0”],[“MESSAGE”,”12”,”HERE”]]

Output: [0,1]

Explanation:

Initially, all users are online.

At timestamp 10, id0 goes offline.

At timestamp 12, "HERE" is mentioned. Because id0 is still offline, they will not be mentioned. mentions = [0,1]

Constraints:

Solution

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public int[] countMentions(int numberOfUsers, List<List<String>> events) {
        int[] ans = new int[numberOfUsers];
        List<Integer> l = new ArrayList<>();
        int c = 0;
        for (int i = 0; i < events.size(); i++) {
            String s = events.get(i).get(0);
            String ss = events.get(i).get(2);
            if (s.equals("MESSAGE")) {
                if (ss.equals("ALL") || ss.equals("HERE")) {
                    c++;
                    if (ss.equals("HERE")) {
                        l.add(Integer.parseInt(events.get(i).get(1)));
                    }
                } else {
                    String[] sss = ss.split(" ");
                    for (int j = 0; j < sss.length; j++) {
                        int jj = Integer.parseInt(sss[j].substring(2, sss[j].length()));
                        ans[jj]++;
                    }
                }
            }
        }
        for (int i = 0; i < events.size(); i++) {
            if (events.get(i).get(0).equals("OFFLINE")) {
                int id = Integer.parseInt(events.get(i).get(2));
                int a = Integer.parseInt(events.get(i).get(1)) + 60;
                for (int j = 0; j < l.size(); j++) {
                    if (l.get(j) >= a - 60 && l.get(j) < a) {
                        ans[id]--;
                    }
                }
            }
        }
        for (int i = 0; i < numberOfUsers; i++) {
            ans[i] += c;
        }
        return ans;
    }
}