一小时内access多次

给 list of [name, time], time is string format: '1300' //下午一点
return: list of names and the times where their swipe badges within one hour. if there are multiple intervals that satisfy the condition, return any one of them.
name1: time1, time2, time3...
name2: time1, time2, time3, time4, time5...
example:
input: [['James', '1300'], ['Martha', '1600'], ['Martha', '1620'], ['Martha', '1530']] 
output: {
'Martha': ['1600', '1620', '1530']
}
/ We are working on a security system for a badged-access room in our company's building.
// We want to find employees who badged into our secured room unusually often. We have an unordered list of names and entry times over a single day. Access times are given as numbers up to four digits in length using 24-hour time, such as "800" or "2250".
// Write a function that finds anyone who badged into the room three or more times in a one-hour period. Your function should return each of the employees who fit that criteria, plus the times that they badged in during the one-hour period. If there are multiple one-hour periods where this was true for an employee, just return the earliest one for that employee.
// badge_times = [
//   ["Paul",      "1355"], ["Jennifer",  "1910"], ["Jose",    "835"],
//   ["Jose",       "830"], ["Paul",      "1315"], ["Chloe",     "0"],
//   ["Chloe",     "1910"], ["Jose",      "1615"], ["Jose",   "1640"],
//   ["Paul",      "1405"], ["Jose",       "855"], ["Jose",    "930"],
//   ["Jose",       "915"], ["Jose",       "730"], ["Jose",    "940"],
//   ["Jennifer",  "1335"], ["Jennifer",   "730"], ["Jose",   "1630"],
//   ["Jennifer",     "5"], ["Chloe",     "1909"], ["Zhang",     "1"],
//   ["Zhang",       "10"], ["Zhang",      "109"], ["Zhang",   "110"],
//   ["Amos",         "1"], ["Amos",         "2"], ["Amos",    "400"],
//   ["Amos",       "500"], ["Amos",       "503"], ["Amos",    "504"],
//   ["Amos",       "601"], ["Amos",       "602"], ["Paul",   "1416"]
// ];
// Expect‍‍‌‍‌‍‌‌‍‍‌‍‌‌‍‌‍‌‍‍ed output (in any order)
//    Paul: 1315 1355 1405
//    Jose: 830 835 855 915 930
//    Zhang: 10 109 110
//    Amos: 500 503 504
// n: length of the badge records array

给一堆input, String[][] badgeTime = {{"Paul", "1355"}, "Amy", "1015", "Paul", "1315", ...},然后要求找出在一个小时的范围内,三次或者三次以上进入的用户,如果用户有多个解,就输出第一个。假如说,Paul有四个时间,13:15, 13:55, 14:05, 14:16,然后就输出 “Paul: 1315, 1355, 14‍‍‌‍‌‍‌‌‍‍‌‍‌‌‍‌‍‌‍‍05”,然后对于所有满足要求的用户都要输出第一个解

https://leetcode.com/discuss/interview-experience/1504226/indeed-karat-interview https://leetcode.com/problems/alert-using-same-key-card-three-or-more-times-in-a-one-hour-period/

import java.util.LinkedList;
import java.util.Collections;
import java.util.List;
import java.util.*;


public class frequentAccess {

    public static void main(String[] argv) {
		String[][] badgeTimes = new String[][] { 
                { "Paul", "1355" }, { "Jennifer", "1910" }, { "Jose", "835" },
				{ "Jose", "830" }, { "Paul", "1315" }, { "Chloe", "0" }, 
                { "Chloe", "1910" }, { "Jose", "1615" },{ "Jose", "1640" }, 
                { "Paul", "1405" }, { "Jose", "855" }, { "Jose", "930" }, 
                { "Jose", "915" },{ "Jose", "730" }, { "Jose", "940" }, 
                { "Jennifer", "1335" }, { "Jennifer", "730" }, { "Jose", "1630" },
				{ "Jennifer", "5" }, { "Chloe", "1909" }, { "Zhang", "1" }, 
                { "Zhang", "10" }, { "Zhang", "109" },{ "Zhang", "110" }, 
                { "Amos", "1" }, { "Amos", "2" }, { "Amos", "400" }, 
                { "Amos", "500" },{ "Amos", "503" }, { "Amos", "504" }, 
                { "Amos", "601" }, { "Amos", "602" }, { "Paul", "1416" }};

		String[][] badgeTimes1 = new String[][] { { "Zhang", "1" }, { "Zhang", "10" }, { "Zhang", "109" },
				{ "Zhang", "110" } };
            
        Map<String, List<Integer>> res = frequentAccessMethod(badgeTimes);
        System.out.println(res);

        // Sample outout:
        //{Jose=[830, 835, 855, 915, 930], Paul=[1315, 1355, 1405], Amos=[500, 503, 504]}
	}

    public static Map<String, List<Integer>> frequentAccessMethod(String[][] records)
    {
        Map<String, List<Integer>> res = new HashMap<>();

        // Build the Map from user --> access records
        Map<String, List<Integer>> userRecords = new HashMap<>();
        for(int i = 0; i< records.length; i++)
        {
            String name = records[i][0];
            int ts = Integer.parseInt(records[i][1]);
            userRecords.putIfAbsent(name, new ArrayList<Integer>());
            userRecords.get(name).add(ts);
        }

        for(Map.Entry<String, List<Integer>> entry : userRecords.entrySet())
        {
            List<Integer> access = entry.getValue();
            if(access.size() < 3) continue;
            Collections.sort(access);
            System.out.println(entry.getKey());
            System.out.println(access);

            LinkedList<Integer> oneHourSlot = new LinkedList<>();
            oneHourSlot.addLast(access.get(0));
            int startTime = access.get(0);
            for(int j = 1; j< access.size(); j++)
            {
                if(timeDiff(startTime, access.get(j)) <=60 )
                {
                    oneHourSlot.addLast(access.get(j));
                }
                else
                {
                    if(oneHourSlot.size() >= 3)
                    {
                        if(!res.containsKey(entry.getKey()))
                        {
                            res.put(entry.getKey(), oneHourSlot);
                        }
                        break;
                    }
                    while(!oneHourSlot.isEmpty() && timeDiff(access.get(j), oneHourSlot.getFirst()) > 60)
                    {
                        oneHourSlot.removeFirst();
                    }
                    oneHourSlot.add(access.get(j));
                    startTime = oneHourSlot.getFirst();
                }
            }
        }
        return res;
    }

    // b is bigger that a
    public static int timeDiff(int a, int b)
    {
        int hourA = a / 100;
        int hourB = b / 100;
        int minA = a % 100;
        int minB = b % 100;
        return Math.abs((hourB*60+minB) - (hourA*60+minA));
    }
    
}

Last updated