Welcome to Subscribe On Youtube

2933. High-Access Employees

Description

You are given a 2D 0-indexed array of strings, access_times, with size n. For each i where 0 <= i <= n - 1, access_times[i][0] represents the name of an employee, and access_times[i][1] represents the access time of that employee. All entries in access_times are within the same day.

The access time is represented as four digits using a 24-hour time format, for example, "0800" or "2250".

An employee is said to be high-access if he has accessed the system three or more times within a one-hour period.

Times with exactly one hour of difference are not considered part of the same one-hour period. For example, "0815" and "0915" are not part of the same one-hour period.

Access times at the start and end of the day are not counted within the same one-hour period. For example, "0005" and "2350" are not part of the same one-hour period.

Return a list that contains the names of high-access employees with any order you want.

 

Example 1:

Input: access_times = [["a","0549"],["b","0457"],["a","0532"],["a","0621"],["b","0540"]]
Output: ["a"]
Explanation: "a" has three access times in the one-hour period of [05:32, 06:31] which are 05:32, 05:49, and 06:21.
But "b" does not have more than two access times at all.
So the answer is ["a"].

Example 2:

Input: access_times = [["d","0002"],["c","0808"],["c","0829"],["e","0215"],["d","1508"],["d","1444"],["d","1410"],["c","0809"]]
Output: ["c","d"]
Explanation: "c" has three access times in the one-hour period of [08:08, 09:07] which are 08:08, 08:09, and 08:29.
"d" has also three access times in the one-hour period of [14:10, 15:09] which are 14:10, 14:44, and 15:08.
However, "e" has just one access time, so it can not be in the answer and the final answer is ["c","d"].

Example 3:

Input: access_times = [["cd","1025"],["ab","1025"],["cd","1046"],["cd","1055"],["ab","1124"],["ab","1120"]]
Output: ["ab","cd"]
Explanation: "ab" has three access times in the one-hour period of [10:25, 11:24] which are 10:25, 11:20, and 11:24.
"cd" has also three access times in the one-hour period of [10:25, 11:24] which are 10:25, 10:46, and 10:55.
So the answer is ["ab","cd"].

 

Constraints:

  • 1 <= access_times.length <= 100
  • access_times[i].length == 2
  • 1 <= access_times[i][0].length <= 10
  • access_times[i][0] consists only of English small letters.
  • access_times[i][1].length == 4
  • access_times[i][1] is in 24-hour time format.
  • access_times[i][1] consists only of '0' to '9'.

Solutions

  • class Solution {
        public List<String> findHighAccessEmployees(List<List<String>> access_times) {
            Map<String, List<Integer>> d = new HashMap<>();
            for (var e : access_times) {
                String name = e.get(0), s = e.get(1);
                int t = Integer.valueOf(s.substring(0, 2)) * 60 + Integer.valueOf(s.substring(2));
                d.computeIfAbsent(name, k -> new ArrayList<>()).add(t);
            }
            List<String> ans = new ArrayList<>();
            for (var e : d.entrySet()) {
                String name = e.getKey();
                var ts = e.getValue();
                Collections.sort(ts);
                for (int i = 2; i < ts.size(); ++i) {
                    if (ts.get(i) - ts.get(i - 2) < 60) {
                        ans.add(name);
                        break;
                    }
                }
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        vector<string> findHighAccessEmployees(vector<vector<string>>& access_times) {
            unordered_map<string, vector<int>> d;
            for (auto& e : access_times) {
                auto name = e[0];
                auto s = e[1];
                int t = stoi(s.substr(0, 2)) * 60 + stoi(s.substr(2, 2));
                d[name].emplace_back(t);
            }
            vector<string> ans;
            for (auto& [name, ts] : d) {
                sort(ts.begin(), ts.end());
                for (int i = 2; i < ts.size(); ++i) {
                    if (ts[i] - ts[i - 2] < 60) {
                        ans.emplace_back(name);
                        break;
                    }
                }
            }
            return ans;
        }
    };
    
  • class Solution:
        def findHighAccessEmployees(self, access_times: List[List[str]]) -> List[str]:
            d = defaultdict(list)
            for name, t in access_times:
                d[name].append(int(t[:2]) * 60 + int(t[2:]))
            ans = []
            for name, ts in d.items():
                ts.sort()
                if any(ts[i] - ts[i - 2] < 60 for i in range(2, len(ts))):
                    ans.append(name)
            return ans
    
    
  • func findHighAccessEmployees(access_times [][]string) (ans []string) {
    	d := map[string][]int{}
    	for _, e := range access_times {
    		name, s := e[0], e[1]
    		h, _ := strconv.Atoi(s[:2])
    		m, _ := strconv.Atoi(s[2:])
    		t := h*60 + m
    		d[name] = append(d[name], t)
    	}
    	for name, ts := range d {
    		sort.Ints(ts)
    		for i := 2; i < len(ts); i++ {
    			if ts[i]-ts[i-2] < 60 {
    				ans = append(ans, name)
    				break
    			}
    		}
    	}
    	return
    }
    
  • function findHighAccessEmployees(access_times: string[][]): string[] {
        const d: Map<string, number[]> = new Map();
        for (const [name, s] of access_times) {
            const h = parseInt(s.slice(0, 2), 10);
            const m = parseInt(s.slice(2), 10);
            const t = h * 60 + m;
            if (!d.has(name)) {
                d.set(name, []);
            }
            d.get(name)!.push(t);
        }
        const ans: string[] = [];
        for (const [name, ts] of d) {
            ts.sort((a, b) => a - b);
            for (let i = 2; i < ts.length; ++i) {
                if (ts[i] - ts[i - 2] < 60) {
                    ans.push(name);
                    break;
                }
            }
        }
        return ans;
    }
    
    

All Problems

All Solutions