【 NO.1 找出 3 位偶数】
解题思路
签到题,枚举所有组合即可。
代码展现
class Solution {
public int[] findEvenNumbers(int[] digits) {
Set<Integer> result = new HashSet<>(); for (int i = 0; i < digits.length; i++) { for (int j = 0; j < digits.length; j++) { for (int k = 0; k < digits.length; k++) { if (i == j || j == k || i == k) { continue; } if (digits[i] != 0 && digits[k] % 2 == 0) { result.add(digits[i] * 100 + digits[j] * 10 + digits[k]); } } } } int[] arr = result.stream().mapToInt(i -> i).toArray(); Arrays.sort(arr); return arr;
}
}
【 NO.2 删除链表的两头节点】
解题思路
快慢指针的经典题目。
代码展现
class Solution {
public ListNode deleteMiddle(ListNode head) {
if (head == null || head.next == null) { return null; } ListNode slow = head; ListNode fast = head.next; while (fast != null) { fast = fast.next; if (fast != null && fast.next != null) { slow = slow.next; fast = fast.next; } } slow.next = slow.next.next; return head;
}
}
【 NO.3 从二叉树一个节点到另一个节点每一步的方向】
解题思路
别离求出从根节点到 startValue 和 destValue 的门路,而后删去公共的局部,再把走向 startValue 的局部全副替换为 U 即可。
代码展现
class Solution {
public String getDirections(TreeNode root, int startValue, int destValue) {
StringBuilder start = new StringBuilder(); StringBuilder dest = new StringBuilder(); getDirections(root, startValue, start); getDirections(root, destValue, dest); int common = 0; while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) { common++; } if (common > 0) { start.delete(0, common); dest.delete(0, common); } for (int i = 0; i < start.length(); i++) { start.setCharAt(i, 'U'); } return start.append(dest).toString();
}
private boolean getDirections(TreeNode root, int value, StringBuilder sb) {
if (root == null) { return false; } if (root.val == value) { return true; } int len = sb.length(); sb.append('L'); if (getDirections(root.left, value, sb)) { return true; } sb.delete(len, sb.length()); sb.append('R'); return getDirections(root.right, value, sb);
}
}
【 NO.4 非法重新排列数对】
解题思路
有向图求欧拉门路的模板题。
代码展现
class Solution {
public int[][] validArrangement(int[][] pairs) {
Map<Integer, LinkedList<Integer>> graph = new HashMap<>(); Map<Integer, Integer> degree = new HashMap<>(); for (var p : pairs) { if (!graph.containsKey(p[0])) { graph.put(p[0], new LinkedList<>()); } graph.get(p[0]).add(p[1]); degree.put(p[0], degree.getOrDefault(p[0], 0) - 1); degree.put(p[1], degree.getOrDefault(p[1], 0) + 1); } List<int[]> result = new ArrayList<>(); for (var e : degree.entrySet()) { if (e.getValue() < 0) { dfs(e.getKey(), result, graph); } } if (result.isEmpty()) { dfs(pairs[0][0], result, graph); } int[][] arr = new int[result.size()][]; for (int i = 0; i < result.size(); i++) { arr[i] = result.get(result.size() - i - 1); } return arr;
}
private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {
var next = graph.get(start); while (next != null && !next.isEmpty()) { int to = next.poll(); dfs(to, result, graph); result.add(new int[]{start, to}); }
}
}