登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 找出 3 位偶数】- y( A1 a. g) h6 e7 S
% @, B; g4 g J) o9 j9 e+ E% S+ X
解题思路
( L0 v6 o% ?/ W, c9 |签到题,枚举所有组合即可。% c& ~" ]0 X# l9 |: F9 s9 u
$ K' X) k {. ]! ?9 Z( s# ~: N
代码展示
$ P* d, q4 M/ K8 y5 N# F
& f4 H8 Z" Z5 o$ D& d" Cclass Solution {
. y& ?" ]5 l1 e1 P* E public int[] findEvenNumbers(int[] digits) {: ]9 a) n( X+ U
Set<Integer> result = new HashSet<>();; Q3 w# r% M/ e* N9 Z. M
for (int i = 0; i < digits.length; i++) {1 c* U. h6 D' n
for (int j = 0; j < digits.length; j++) {
5 |8 E t- m- a- y! m5 `3 P0 a( r for (int k = 0; k < digits.length; k++) {9 `4 n8 D1 p& \# q5 S" l1 W$ k: s
if (i == j || j == k || i == k) {# S' E6 x) F# j% Z% H0 @) k
continue;
! d8 o" C0 `) F' @2 ?8 g. Q& O }
8 E$ Z+ M' q3 t6 g if (digits[i] != 0 && digits[k] % 2 == 0) {. h/ a: p/ t+ ^/ Z$ X" g. x
result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
' f# B1 W2 Z4 t q; R8 a1 b e; d }7 L+ ?$ [5 c# L0 N
}
+ j1 i! r3 X. o8 q }+ G2 z3 T8 Y j, R
} b. R: X- ^% l" _+ V
int[] arr = result.stream().mapToInt(i -> i).toArray();! v& ]8 X4 C4 N$ H: X
Arrays.sort(arr);; m: k8 E- n) d# n" r& i! F8 q# S
return arr;
$ o) l U9 k1 g+ V8 g }
" C4 O5 H3 m7 c# f# o5 ~}! s7 G5 k- C7 Y" m% x1 q
7 E& m7 \; k8 ]* M% C& [( E
7 j) a$ _. m1 K) u" z$ D! {* e, Y+ }【 NO.2 删除链表的中间节点】: x o# Y, ?" L6 H: z/ D
" R$ S( o# E# ]! g6 y2 s
解题思路
- C) a4 \4 _5 E1 P& _* `- w快慢指针的经典题目。
! a) h4 D; z/ {) ?# E8 t2 y) u' G. S+ e; r0 O
代码展示
$ t( ^4 |& q8 r- g' W; e+ C' N2 n% k
, G# Z! X8 @3 e5 h eclass Solution {
" Y, \" U) w% T9 S( v public ListNode deleteMiddle(ListNode head) {5 G6 c2 r6 J2 ~! o
if (head == null || head.next == null) {0 \/ c6 L! A8 E
return null;
$ g+ P2 g. ?* Q ~* ~ }
* W7 b' d9 ^, A% T3 u; l ListNode slow = head;
! X6 e( P6 ~3 C* G5 M ListNode fast = head.next;
5 n7 m: a8 b7 Q, b2 |: j: I while (fast != null) {, P0 T- m8 E4 a( G/ I2 h5 J
fast = fast.next;
9 H7 |# A9 {# _; q if (fast != null && fast.next != null) {
# A( b/ W7 C9 D* U' s6 ?, D slow = slow.next;+ Q6 e K5 G! W" a7 e1 y% R, l* J
fast = fast.next;
* T+ R! S, w a' _( l }* m5 W6 M1 a4 C$ K
}
$ {6 N. O) Y: i" ]0 J B slow.next = slow.next.next;
8 _3 S+ k) r3 R' P( u return head;
+ X' c6 v8 [( {4 v4 l! U# [ }# {- p8 d5 G& t
}8 b" q* I) A& I$ T, x& e. \% x
$ S$ ]9 d. l8 o" V9 U" L4 [
9 b- `0 w0 p/ v: Z【 NO.3 从二叉树一个节点到另一个节点每一步的方向】
! W4 U6 G& e: `; l( C% P+ i: }/ T8 U- W5 H. G5 D* `) z
解题思路0 C/ w, M3 b4 x1 [ z2 m
分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。
- r- i! G/ o3 R% X* W X, X6 v* V
% |+ s* J# F& {) j" B5 n' [代码展示0 |- W3 k) v: W" D- [
( W, K4 j3 m8 O7 x7 {5 v4 X
class Solution {
+ E8 T; o3 s z public String getDirections(TreeNode root, int startValue, int destValue) {
% d/ m3 i5 q0 b {% L7 p$ n0 u; ? StringBuilder start = new StringBuilder();
" z% n6 O0 T6 e StringBuilder dest = new StringBuilder();
6 Z9 d6 q. H" _; T9 Y getDirections(root, startValue, start);2 A$ @; X/ o; p& U# X$ c5 ~
getDirections(root, destValue, dest);: q4 B5 m2 m0 f5 x2 K2 S3 l0 P) Y
int common = 0;4 H! L9 L+ Q5 ^) U# {
while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {
* R6 f3 v! `5 H' Q$ k7 o* p( a common++;+ O2 K1 {8 A: D0 P
}" U/ \: a: z+ I2 m+ @( Z4 Z8 ~
if (common > 0) {& I' H0 |% p; A4 x4 x
start.delete(0, common);0 w& O/ X: @/ N5 i
dest.delete(0, common);
2 C h+ D$ ~1 o+ p; i }6 |3 j4 H; }& q
for (int i = 0; i < start.length(); i++) {
4 t4 w- L! z$ H& ]2 {2 B! t start.setCharAt(i, 'U');
2 j; u/ ^* }$ I+ Q5 v }- T8 [; y) X* R0 R9 v' O
return start.append(dest).toString();
: r$ e( B4 i2 a/ \4 `2 ^5 ?' x/ | }) F3 H1 O9 Q# f& t( \4 x
# [/ r/ m, I! r. e: {/ I( z& G, t
private boolean getDirections(TreeNode root, int value, StringBuilder sb) {8 M4 v- u7 v# @0 f) Q
if (root == null) {
1 s6 Q/ G9 o4 W- L return false;
- q6 ]$ W" ?, W$ x }
, _+ u+ E/ u$ k2 Z0 I2 N if (root.val == value) {
2 L5 b& Y% A4 @0 P+ c H. a return true;
8 {3 B! M/ J+ I4 i }
, ?0 @+ p/ ]# P3 g9 F int len = sb.length();6 c2 y2 ?5 D' H" B* g; B0 A
sb.append('L');( I+ `7 ?' Z2 Q; R$ S
if (getDirections(root.left, value, sb)) {
3 [. m7 C- B$ Q) A: o8 I6 c return true;5 Z% ^. ]6 k) q
}
4 z) Y' c& T% \; Z& y" W6 q sb.delete(len, sb.length());
6 o6 ^: X5 r0 m& B sb.append('R');
4 r4 ?9 W9 S4 b2 r9 s9 { return getDirections(root.right, value, sb);
! z! `: [) H9 ]% ^3 k( K }' D4 F4 q: s3 T: v& l4 S; a
}
1 _. X: Z2 `* }9 [( p$ o& q
9 Z( k/ ]- U$ \+ c2 j* [' h! i; y& U5 L- B
【 NO.4 合法重新排列数对】7 a s6 u: k' R7 B1 x; Q! T% |
! s& b8 s& E# z( O) F Z. V* y解题思路
4 f9 P! }' B1 v有向图求欧拉路径的模板题。1 b* @, ~4 F9 l1 q. ~3 N
6 i5 Z7 E5 w$ I# @4 n代码展示
6 a7 b5 o4 m9 ` V- _( l- K" \% ?3 H7 ?9 h- e5 ^
class Solution {. A% f1 K& V& E1 e' m2 p) P
public int[][] validArrangement(int[][] pairs) {
$ x% V' L+ c2 z3 E- b& a Map<Integer, LinkedList<Integer>> graph = new HashMap<>();
5 G0 O' H' g! l+ I( u( W) D Map<Integer, Integer> degree = new HashMap<>();
* Y8 R$ Q4 ^/ ? for (var p : pairs) {
R* y4 H9 f# _, d if (!graph.containsKey(p[0])) {3 j/ ]8 V& t3 q$ N
graph.put(p[0], new LinkedList<>());
" M4 R5 e/ z' {; j+ f3 a. ~7 D } S4 r# F7 Y# S6 L& y; N6 L
graph.get(p[0]).add(p[1]);
# u: W3 Q7 A6 } degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);
8 j5 D; o& U( _ ]; ` degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);
p: \; F' u+ s8 I5 H8 t; J( M }- R. ?( q, A/ p& K$ O
List<int[]> result = new ArrayList<>();
5 h2 Q! o- V6 U! V for (var e : degree.entrySet()) {% i# Y8 n5 A8 |" _% v5 U4 R
if (e.getValue() < 0) {
/ u( R9 z$ Q& W# G P$ N dfs(e.getKey(), result, graph);
/ c: [7 L5 p1 J }
: @ O5 l- ^. Y) p }
1 S6 l% M1 O8 a" l% W5 s if (result.isEmpty()) {8 d4 D4 C$ O5 A5 h7 s
dfs(pairs[0][0], result, graph);
9 @, t' A: l( L5 u) l+ g. j# h" h) }& f }
) G% l; C2 M+ R( [, o7 m* ^ int[][] arr = new int[result.size()][];2 ^8 A! i9 M7 W$ J: \+ b
for (int i = 0; i < result.size(); i++) {# m, N+ i' {# K5 S1 {
arr[i] = result.get(result.size() - i - 1);
" N2 e4 }+ ^8 x+ Y7 O1 c }8 A$ ^. B% B- V5 ~: m8 q" T/ l
return arr;
' J0 {; F }% U) r# I }
5 Q+ h( t8 `2 A# F$ t
+ t2 N# Y/ a& F; }1 S3 l D5 y3 { private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {1 u7 h+ s% \3 e1 p: |( O. a
var next = graph.get(start);9 m& `! H$ S0 Q2 F) C9 W
while (next != null && !next.isEmpty()) {
3 [: k! |$ n1 m& ?0 ], G int to = next.poll();
, ^" {$ \/ k' n% x: r dfs(to, result, graph);
& V# T( t* m0 j: x! f9 r$ C) v, |2 X result.add(new int[]{start, to});6 x! |; @* p/ s6 x& \ h0 B; A7 J
}
& K) l8 N0 g* {4 ]2 g }; E7 _$ ]! ?0 V J; Z/ T
} |