Untitled
unknown
java
a year ago
3.5 kB
6
Indexable
import java.io.*; import java.util.*; import java.util.regex.*; import java.util.stream.Collectors; class Result { /* * Complete the 'validateRequests' function below. * * The function is expected to return an INTEGER_ARRAY. * The function accepts following parameters: * 1. STRING_ARRAY blacklisted_ips * 2. STRING_ARRAY requests */ public static List<Integer> validateRequests(List<String> blacklisted_ips, List<String> requests) { // Precompile the regex patterns for blacklist IPs List<Pattern> patterns = blacklisted_ips.stream() .map(ip -> ip.replace("*", ".*")) // Convert wildcard to regex .map(Pattern::compile) .collect(Collectors.toList()); // Map to keep track of the timestamps of the requests (for rate limiting) Map<String, Deque<Integer>> ipTimestamps = new HashMap<>(); // List to store the result for each request List<Integer> results = new ArrayList<>(); for (int i = 0; i < requests.size(); i++) { String requestIP = requests.get(i); boolean isBlocked = false; // Check against blacklist for (Pattern pattern : patterns) { if (pattern.matcher(requestIP).matches()) { isBlocked = true; break; } } // Check rate limit only if not already blocked by blacklist if (!isBlocked) { ipTimestamps.putIfAbsent(requestIP, new ArrayDeque<>()); Deque<Integer> timestamps = ipTimestamps.get(requestIP); // Remove timestamps outside the 5-second sliding window while (!timestamps.isEmpty() && i - timestamps.peek() >= 5) { timestamps.poll(); } // Check if the rate limit is exceeded if (timestamps.size() >= 2) { isBlocked = true; } else { // If not blocked, record the current timestamp timestamps.offer(i); } } // Add the result for the current request results.add(isBlocked ? 1 : 0); } return results; } } public class Solution { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); int blacklisted_ipsCount = Integer.parseInt(bufferedReader.readLine().trim()); List<String> blacklisted_ips = new ArrayList<>(); for (int i = 0; i < blacklisted_ipsCount; i++) { String blacklisted_ipsItem = bufferedReader.readLine(); blacklisted_ips.add(blacklisted_ipsItem); } int requestsCount = Integer.parseInt(bufferedReader.readLine().trim()); List<String> requests = new ArrayList<>(); for (int i = 0; i < requestsCount; i++) { String requestsItem = bufferedReader.readLine(); requests.add(requestsItem); } List<Integer> result = Result.validateRequests(blacklisted_ips, requests); for (int i = 0; i < result.size(); i++) { System.out.println(result.get(i)); } bufferedReader.close(); } }
Editor is loading...
Leave a Comment