登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出 3 位偶数】
$ D6 o" M4 w8 O" J2 F+ a1 [) h* c2 }- G9 h* a9 ~* h0 V0 ^! w
解题思路
9 ?6 p! ?& A, N* b3 a6 f签到题,枚举所有组合即可。
0 {% Y, a. q" z* G: o# o( A1 p
5 V. g3 X _2 h; b代码展示
4 y% u D2 k" ^& D n i4 A# }3 ^+ _* T4 q, D! Z
class Solution {" q2 y0 `2 U- F/ {; J/ W
public int[] findEvenNumbers(int[] digits) {
n& V7 }9 z8 R4 F Set<Integer> result = new HashSet<>();
$ O& ]& U V7 }; B6 G Y for (int i = 0; i < digits.length; i++) {/ K( b. v2 o6 ~8 J
for (int j = 0; j < digits.length; j++) {
6 `8 G5 @/ w$ \3 L% l2 e for (int k = 0; k < digits.length; k++) {
) _" f: `$ H$ t) b- A( C/ f if (i == j || j == k || i == k) {! e5 Q* M4 ?$ L: L; r9 O1 b+ z: P
continue;
( y- {( w! z* ~7 v' N }/ ?1 W& s9 |+ @+ s9 }
if (digits[i] != 0 && digits[k] % 2 == 0) {! j* g9 m6 J- S4 _- F1 D
result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
# w$ A6 `+ L1 b$ p! i }
" ^7 K; b$ c/ v+ s% }- { }8 {5 u& w) u+ [% g" }1 S
}
" O6 k- [3 |6 E' q( k$ j# M }: ^$ ~+ ]7 B$ k* w. s/ j+ E! w3 o8 \
int[] arr = result.stream().mapToInt(i -> i).toArray();, d0 p' s( }" E9 [5 n
Arrays.sort(arr);7 \# R" Q) M" t2 P) }* V% @6 s
return arr;
% X# e& x2 B! V }
% K6 W! T) X4 P1 \, w7 u}
8 |6 ?9 [2 ~. [7 u- b+ D, z8 {% u3 }/ C+ P& J6 ^
& `) y1 H ^- R8 l# A; c) r【 NO.2 删除链表的中间节点】6 m7 @9 w2 Z2 d5 C
- f+ Z/ W* L3 r解题思路+ k" l7 s! ~! _2 L6 G& w
快慢指针的经典题目。. n R$ D. ^1 g/ T
; A9 u4 B! S# u+ C代码展示
; P0 ~! S7 p7 {5 p6 n6 I, c" B1 Z* n& m) I, K1 d
class Solution {# Q4 x6 V% v( C7 Q/ {$ q+ r( w% L
public ListNode deleteMiddle(ListNode head) {$ ^- u( l0 b& U" F
if (head == null || head.next == null) {9 @0 Z- p! f, t$ ^! Z
return null;
8 M$ Y' _* h' e4 J; X }3 W$ Y3 M# t" d0 |+ D
ListNode slow = head;2 H# a+ \: t7 [% d; s+ g
ListNode fast = head.next;1 a; u {( J- [& ?) U8 ?/ h: N
while (fast != null) {( x V) e/ M7 u& e7 x
fast = fast.next;
[5 t( k! {2 l j" v/ } c if (fast != null && fast.next != null) {# s8 v# f: y; N6 v( O' X
slow = slow.next;/ d* ^9 U' Y L* N; s* M6 a
fast = fast.next;/ f/ }. n, M/ E
}* U1 Z' w% ]$ ^3 \" J) C& m% @+ `
}
% L$ e( [) X# Q& [" B+ i slow.next = slow.next.next;
' J6 E2 z6 M1 Y) E9 f7 M return head; C9 _; _0 J! }7 V2 q" h, _
}
8 b% s0 U. ?- B3 d) c+ b1 S}: Q4 r, X5 @$ }$ ~
) d4 W& m9 @, h T
- ]% x/ t- o9 s( n% C【 NO.3 从二叉树一个节点到另一个节点每一步的方向】3 m; t. |( |! ]9 O5 D' a
! l8 X+ j* } O# q! \6 a2 f
解题思路
- A: W# N5 k/ K U! Y9 L$ n分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。
! a( }# ~: [* I' m/ ^3 V6 m, ~$ k8 I
代码展示
; w3 f# J0 L- o L( `5 _, ^2 t' P( V1 s* O! }; ~! T5 T/ Y
class Solution {
, B! ?, p! }6 w ? public String getDirections(TreeNode root, int startValue, int destValue) {
0 h B- Y# _2 }. _6 t/ o2 ? StringBuilder start = new StringBuilder();) D& V6 f- Y% T8 t# K
StringBuilder dest = new StringBuilder();
" J/ l! L5 a' b' }+ x! O getDirections(root, startValue, start);+ \) i3 x. {2 A6 S# t0 l7 c
getDirections(root, destValue, dest);
* ]7 u! |) j" `) W1 x9 J! W int common = 0;
! W7 U2 B7 d' e# G. A" y while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {1 t7 {, l* W( u3 }' v/ P( q- x
common++;9 [$ d9 E) M4 V! g3 P0 Z. d
}. W- e. t" }% O
if (common > 0) {
8 M9 ^3 ]; h* Y6 M start.delete(0, common);
$ A& ~2 }, A% A. Z1 p0 L dest.delete(0, common);
- t7 \$ n# A, m* z }6 n& K3 N, G6 O/ C& G8 R
for (int i = 0; i < start.length(); i++) {3 b- N) h2 f' |% j' p3 q( F, p4 N
start.setCharAt(i, 'U');
0 Q/ |2 E. v" D$ c }
# g+ W" l+ E# \0 I8 Z4 S4 x return start.append(dest).toString();
* V0 [0 x) @, C( C }
& o3 p. l& ^+ D
! Y, N7 n) A% o1 Z. H3 y% J private boolean getDirections(TreeNode root, int value, StringBuilder sb) {
( @# C1 u X3 F" J if (root == null) {; l6 q9 m9 l8 L$ A
return false;5 i; C; y- i9 e2 T; M
}
! |# z5 M' u$ R+ m( ^. J8 T! Z if (root.val == value) {
. v3 [2 ^5 _) K return true;3 x+ _$ r) B" c1 S# S6 ?: m
}
* O, K+ D- y$ ?4 @' {! p int len = sb.length();
( i$ ]! @* d% z, A+ A) u sb.append('L');. Y/ f! g3 {9 E* j/ K2 `! Z7 J' Q
if (getDirections(root.left, value, sb)) {
% o5 Z+ Y; }( h! ?8 |% X r return true;" l: v/ f& J$ {$ W
}
' h$ ~+ B5 m- l sb.delete(len, sb.length());. n4 L) s7 a/ |* Y3 L" B/ l8 O
sb.append('R');
6 e; a2 |7 Z a5 v return getDirections(root.right, value, sb);% b3 i/ \: n- k# R9 F
}
3 g8 S* x' n( j v}
0 A2 i) S- g& @- b' b% V' e( C* @. p$ o# X# ~3 J
1 `; k' S8 a k/ l _! n* r7 A
【 NO.4 合法重新排列数对】
4 ~ l1 I5 |* i% h" O' x# O& B: [' n" N6 t9 Y
解题思路
7 ^; H0 f) J& X有向图求欧拉路径的模板题。% T' \' D& L) X9 f0 W1 N
7 ]" X3 k5 Z8 }代码展示
6 v3 b0 k* X. f9 H" Z6 m
! r- s5 {& e& l) y& E: Dclass Solution {
' L+ W. d. K. n& e% K public int[][] validArrangement(int[][] pairs) {
0 F* ]: x( \+ ?( x5 x+ ]! |6 h. e Map<Integer, LinkedList<Integer>> graph = new HashMap<>();. q1 |9 h6 W7 V# R. A; Z
Map<Integer, Integer> degree = new HashMap<>();
: ]) y1 T" {$ N for (var p : pairs) {
# X$ E. v/ e( [4 Y* @ m- Y# l if (!graph.containsKey(p[0])) {
) v$ _6 R% Y* O% U- i" y8 W" k graph.put(p[0], new LinkedList<>());2 w" c% B9 b6 [6 I2 P
}
' h( e3 _5 E: d& ~ graph.get(p[0]).add(p[1]);) X" H. G% k/ V8 T* b
degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);8 T- I4 R+ p9 F9 k" g- u
degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);4 R! Y8 g. M6 _
}
0 E) }( g# L" w; X9 ] List<int[]> result = new ArrayList<>();) Z8 D' j8 V7 |
for (var e : degree.entrySet()) {) w0 W1 H* S3 t) S* u0 L" I
if (e.getValue() < 0) {$ |( ]: u ]5 H- S
dfs(e.getKey(), result, graph);9 |- X4 D- T' v H* ~, [
}3 k1 Q; V6 S5 H6 ~, N2 ^2 ^/ l' y
}
3 \" s4 S* i; `5 S if (result.isEmpty()) {
3 _4 c& W3 {" H. \; O dfs(pairs[0][0], result, graph);
9 X, i3 L/ j8 ?0 K U' i. H5 t }' }& `5 @& z6 a2 `3 s/ m/ Z$ t
int[][] arr = new int[result.size()][];
6 q" S' R$ m( S) s for (int i = 0; i < result.size(); i++) {
2 x" x. C! O" i! ?1 p1 ~ arr[i] = result.get(result.size() - i - 1);
( r1 J5 n5 ^1 P8 s/ { }
! ?6 d [" u0 t: |5 } `1 X- L return arr;
9 I% R! |+ k9 t Z0 v- A! J) O& q }
- Q$ K7 }. }0 f7 o L. s6 f/ G7 |' O" ?! ?1 J! f
private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {% e2 @; b8 B0 e$ o7 m7 D+ b: i
var next = graph.get(start);
, \7 R. i5 c+ P: C; G. V. {. T! w( i& v while (next != null && !next.isEmpty()) {
* b! I/ r2 x# v3 v) `6 n8 f H int to = next.poll();
1 U5 K) e: |5 _- Y* G/ _ dfs(to, result, graph);
1 ]: Q- g6 G& K5 j0 k+ |" K result.add(new int[]{start, to});
; m* e( h5 g4 e+ f4 _ }0 G" h/ y2 O$ f9 u0 P4 }
}
5 ?" P7 O M8 P* o$ [} |