See More

import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class Solution5 extends Solution { public Solution5() { super(5); } public static void main(String[] args) { Solution solution = new Solution5(); solution.testPartTwo(); } @Override String solvePartOne(String inputData) { String[] lines = inputData.split("\n"); List ranges = new ArrayList<>(); int i = 0; // Read only the first section (ranges) for (; i < lines.length; i++) { String line = lines[i].trim(); if (line.isEmpty()) { i++; break; } String[] parts = line.split("-"); long a = Long.parseLong(parts[0]); long b = Long.parseLong(parts[1]); ranges.add(new long[]{a, b}); } // Sort by start ranges.sort(Comparator.comparingLong(r -> r[0])); // Merge intervals List merged = new ArrayList<>(); for (long[] r : ranges) { if (merged.isEmpty()) { merged.add(r); continue; } long[] last = merged.get(merged.size() - 1); if (r[0] <= last[1] + 1) { last[1] = Math.max(last[1], r[1]); } else { merged.add(r); } } long count = 0; for (; i < lines.length; i++) { String line = lines[i].trim(); if (line.isEmpty()) continue; long id = Long.parseLong(line); if (isInRanges(id, merged)) { count++; } } return String.valueOf(count); } private boolean isInRanges(long id, List merged) { int left = 0, right = merged.size() - 1; while (left <= right) { int mid = (left + right) / 2; long[] r = merged.get(mid); if (id < r[0]) { right = mid - 1; } else if (id > r[1]) { left = mid + 1; } else { return true; } } return false; } @Override String solvePartTwo(String inputData) { String[] lines = inputData.split("\n"); List ranges = new ArrayList<>(); int i = 0; // Read only the first section (ranges) for (; i < lines.length; i++) { String line = lines[i].trim(); if (line.isEmpty()) break; String[] parts = line.split("-"); long a = Long.parseLong(parts[0]); long b = Long.parseLong(parts[1]); ranges.add(new long[]{a, b}); } // Sort by start ranges.sort(Comparator.comparingLong(r -> r[0])); // Merge intervals List merged = new ArrayList<>(); for (long[] r : ranges) { if (merged.isEmpty()) { merged.add(new long[]{r[0], r[1]}); continue; } long[] last = merged.get(merged.size() - 1); if (r[0] <= last[1] + 1) { last[1] = Math.max(last[1], r[1]); } else { merged.add(new long[]{r[0], r[1]}); } } // Count total IDs across merged ranges long count = 0; for (long[] r : merged) { count += (r[1] - r[0] + 1); } return String.valueOf(count); } }