登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出 3 位偶数】$ n6 E4 H1 ]4 Q8 O2 n
- A- K l$ q: J, R3 E
解题思路/ W4 z) |, I/ [, U. ], ?
签到题,枚举所有组合即可。
! R4 Y, h" |& g) R* J) [+ m& k; I
代码展示/ `. x8 @5 v2 X6 z% y$ k
5 [# W* J& o3 l4 w( K9 I/ y
class Solution {' q3 d7 f& K4 `& N+ ?
public int[] findEvenNumbers(int[] digits) {
' x8 ]4 w0 ^- f# A Set<Integer> result = new HashSet<>();) v1 k" O1 E( \: A$ B+ u# I
for (int i = 0; i < digits.length; i++) {. N9 t/ r3 s3 g9 E4 p4 S s; B
for (int j = 0; j < digits.length; j++) {
5 n8 P/ p/ w) C6 k9 b2 m for (int k = 0; k < digits.length; k++) {2 K, L3 r/ _1 Z9 X, K Y& L5 {+ O
if (i == j || j == k || i == k) {! l2 i# q+ d8 U, h- G
continue;- h6 Q3 E3 O6 Z2 Q6 Y$ n
}6 O \2 I& T% H
if (digits[i] != 0 && digits[k] % 2 == 0) {
1 h- `3 ?8 x s. f$ [ result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
$ k7 m4 |5 @: ]/ u& W1 b }7 P- b/ ~# z8 _+ u# ^9 E: N
}% ]! z! u# V; c3 w7 v; ~. a. e
}
$ ~4 Q. c3 }1 E1 s }/ ]/ W% P) L2 E
int[] arr = result.stream().mapToInt(i -> i).toArray();
* W7 c3 r8 Q) v$ l Arrays.sort(arr);, X4 r0 P, t6 b6 s1 y5 N
return arr;
3 c; y! x9 e! N }
4 @4 x# k- i8 c$ t5 Q& r7 S}( I1 i8 c. C) j
' r2 B: s0 a; K% n/ g. l7 C$ R0 z
* g6 Y* i% |9 k0 I2 S: ~4 |* \5 K
【 NO.2 删除链表的中间节点】" v, r4 P2 f' ?; q) S! s
+ g/ z; k$ g. q/ j/ d2 z" b解题思路$ g! z$ D) w: X/ Z" z
快慢指针的经典题目。
* L/ W3 E0 e4 Z5 o5 Q v0 W: c. V9 Y9 D8 y' L |8 Q
代码展示
# Z: L- ~6 o' ]$ f o, t$ L: T8 c/ V
class Solution {
, v$ O1 p# t4 x public ListNode deleteMiddle(ListNode head) {& i% q: i; j; \, Q! T
if (head == null || head.next == null) {4 C- ^* [# O: c- Y7 Y
return null;' J3 Q+ W& P3 L! ]4 E& y9 b4 k# e
}
% h" O& i9 b. |. Q ListNode slow = head;
1 y; H( ^" s E, O3 [ ListNode fast = head.next;0 T2 B( Y) y- G
while (fast != null) {
& _, |% G: ]( M8 j$ ^1 J fast = fast.next;7 |9 _% F( B9 j s) c3 D% P5 E4 m
if (fast != null && fast.next != null) {
4 ~, Z( H+ w, y5 S8 \ slow = slow.next;
1 F. ?0 n% K( n: D fast = fast.next; `* q3 w, K. i9 ~
}! S4 b5 c! Y' O- z* ?
}
9 @1 i6 H' N+ o! W- @8 H slow.next = slow.next.next;
# v1 y% W* c% Y" l3 v" i$ L) g return head; M$ V/ q v u& X; ~( g( d
}
/ \2 p! E2 \/ c- v, `# c5 Y}8 m! l$ _2 h: S
4 e( {) b! x1 u. d4 _2 j
; F, R" N9 i' o& C( [9 Y' ]% j. `& R【 NO.3 从二叉树一个节点到另一个节点每一步的方向】" [+ x2 t/ \2 K+ j& O
) u1 T/ H. E1 T3 V/ Z9 @/ h4 x解题思路7 O7 n+ Q, E4 {$ P' e
分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。 e- A/ i* H% X: S5 [0 Q" X
& t3 ~5 u; f3 v代码展示
C% d6 m, I$ `5 C2 J K# a: T& ~ z! v
class Solution {
5 R0 o( |5 f; c: d6 d- K/ V3 ~ public String getDirections(TreeNode root, int startValue, int destValue) {
# N1 l8 @ Q, S6 P6 n StringBuilder start = new StringBuilder();, o8 J$ @3 p( y: X8 C9 {1 \- i
StringBuilder dest = new StringBuilder();$ H( }; E/ i" W2 h. D
getDirections(root, startValue, start);
8 P0 K M0 P( w. v9 @ getDirections(root, destValue, dest);* j( Q3 K. a1 D, ]
int common = 0;
. h/ T/ k, q2 s; S+ Z! C while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {
6 M3 p, w3 x( l% V3 B6 x common++;
$ d! C5 t+ F: H% l }
/ S# o- a1 M3 _4 o) ?, g8 ^ if (common > 0) {" ?0 Y# f( o# A
start.delete(0, common);
! q& a: N$ S5 \* n dest.delete(0, common);+ s* n! m1 T- W: D4 _
}
0 ?: N' L. o4 r2 N7 g, F6 \ for (int i = 0; i < start.length(); i++) {
4 z+ V6 J' M6 y# U start.setCharAt(i, 'U');
8 Q w6 K _8 F$ U* p3 E2 P( {9 p }
7 C2 q' I( y# Y( W+ ? w return start.append(dest).toString();+ z6 I* Q0 q+ R- T9 m
}/ Y W+ M g; S& H' W' V
: y& Y0 `$ E: m6 N0 w8 y& J private boolean getDirections(TreeNode root, int value, StringBuilder sb) {
+ O2 M1 c; {0 L! c if (root == null) {5 c% E2 b! O! Q1 }2 P, |' u
return false;8 E9 s8 \7 Z% {7 @4 u1 L
}
6 F# o1 V9 {4 y) U if (root.val == value) {
6 P! P/ ?7 C3 y F Z/ Q return true;
8 o2 V7 s4 ]3 R& t }" P3 e" Z! C6 t) K" t& v
int len = sb.length();
- A# K0 D: l ?, `4 p sb.append('L');
- I8 f+ g3 ^0 e0 \ if (getDirections(root.left, value, sb)) {8 P- F6 u* _( U, d3 b
return true;
/ V+ E+ V/ @" Y9 V }
' {: Z, D3 r) V1 N1 V9 |# ^2 P$ b sb.delete(len, sb.length());
% C/ `) P" S6 N; L& P- X sb.append('R');+ Q+ t2 E" D7 p( i Q J+ \
return getDirections(root.right, value, sb);, y% k& b0 a, f8 K* |
}
6 ^1 y( d* g+ q9 M* b+ D}$ s+ V" R8 l3 a A a1 I
5 A7 w/ c9 K: m/ { _, w) A# M
3 w& C+ ?& O+ R+ Q; Y* ?% V. t/ g【 NO.4 合法重新排列数对】* A x" m0 i5 k
3 U9 D+ ~( I9 ]# D0 I( ~% `0 v
解题思路 R1 G# C+ d. U/ e( v3 m
有向图求欧拉路径的模板题。7 S* ^; c# [% T! @
, [( U k. \' L代码展示
& Z( i0 B0 ?0 R! J* Z9 E3 F9 j5 x
( K# P1 ]" e. N& y2 z K& ?; q4 Wclass Solution {/ @) m; }' p* y0 \
public int[][] validArrangement(int[][] pairs) {1 h- U3 v" h% a# q
Map<Integer, LinkedList<Integer>> graph = new HashMap<>();8 @, L6 ~% L2 g) T7 G
Map<Integer, Integer> degree = new HashMap<>();
, z0 H, Q- [. H* r5 ~2 r. e for (var p : pairs) {- _6 _0 i/ w8 H- D, e
if (!graph.containsKey(p[0])) {* @! Y7 T4 t. A* t. I0 Z
graph.put(p[0], new LinkedList<>());
5 e/ v3 B+ W* o$ | }0 N) m1 u, B* D- ]% t+ `+ p. H
graph.get(p[0]).add(p[1]);
3 O0 t% S" V6 X/ N/ n+ O degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);
/ W: p9 V E3 D: m+ k degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);
- ~+ `- z# W- H6 r% B4 o& y }; r. I% t5 w8 D& k
List<int[]> result = new ArrayList<>();
- h4 o$ X7 L/ z; S% C/ Q for (var e : degree.entrySet()) {! ?2 Q7 D; i% l/ V
if (e.getValue() < 0) {
: `) z1 E, ~* E9 A6 X; U; Q+ Q dfs(e.getKey(), result, graph);1 P; x- S! Z, b5 U2 P% ]
}
3 [% {" I' T1 B- [& b1 ` }
W/ H% J$ c9 f0 a if (result.isEmpty()) {
! A! ]# E1 q( X. F4 A- S k( e dfs(pairs[0][0], result, graph);
& X. Y5 N0 {4 q# j0 L }3 x/ @; c% W2 c0 K1 u
int[][] arr = new int[result.size()][];: R7 [$ `! m5 W6 L7 }: _+ ]8 |
for (int i = 0; i < result.size(); i++) {
7 X0 \$ m1 r, I2 O4 p* c* j+ q arr[i] = result.get(result.size() - i - 1);
, }1 f8 s+ @9 [: {! G, b. r1 z }# Y& S; [ t: e/ v6 V7 W
return arr;
! t g+ q; J+ v+ ? }1 S0 o6 @- n$ ^ O+ c+ [
( [4 @4 l3 q! F, D0 `$ T L e private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {
% G; V5 `- x. ?+ E; ~ var next = graph.get(start);( } W0 L4 |: t/ g! K8 ]! j
while (next != null && !next.isEmpty()) {
3 L, {2 Y* G5 [+ O& ^& v4 [9 N, x int to = next.poll();
0 P) Q* y" o0 z% }& T* [8 r dfs(to, result, graph);
# N$ _: v/ H/ h' ]/ q" v7 e result.add(new int[]{start, to});& f1 a+ c0 U6 C: J. X3 R3 h6 g
}
3 y# R+ V4 ~7 N }( H4 {% g/ Z* P$ ^3 d8 V y
} |