找回密码
 注册账号
置顶:如何加入2024届新生微信群

[吹水聊天] 上岸算法LeetCode Weekly Contest 270解题报告

上岸算法 回复:0 | 查看:2143 | 发表于 2021-12-6 17:13:53 |阅读模式 |复制链接

UWCSSA提醒您:

警惕网络诈骗与盗号,不要在他人发送的网站中输入密码,换汇或付款时请小心诈骗。

为了避免个人信息泄漏,建议在帖子中使用不常用的邮箱,或使用私信发送联系方式(点击对方的头像,然后“发送消息”)。

帖子通过审核只代表内容不违规,CSSA 不会验证内容的真实性。请谨防诈骗。

登录后可回复主题

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
【 NO.1 找出 3 位偶数】
) ~# L$ H+ I7 `1 s" z; }& f# V2 Q0 @! Q3 M7 d5 H. B
解题思路# v0 R3 r" D: b5 E5 E
签到题,枚举所有组合即可。
! Z( ~' \5 d- p0 w# {1 G" {' i3 Q9 n1 t# C+ F2 [4 q6 e/ Q
代码展示
+ R& r6 E" J$ }6 Z2 E$ ~+ t- G
/ @8 [3 q* R5 Yclass Solution {& @6 H3 @( H$ Z) L% V/ f
   public int[] findEvenNumbers(int[] digits) {4 V0 p& A6 _+ i  d
       Set<Integer> result = new HashSet<>();( j/ c  n- F6 Q
       for (int i = 0; i < digits.length; i++) {: c& Z0 B* e% g
           for (int j = 0; j < digits.length; j++) {
  B- ]$ S( v' R3 o& t               for (int k = 0; k < digits.length; k++) {# Z4 v, g6 A1 d. Y: w* F
                   if (i == j || j == k || i == k) {
4 t/ z/ }; J& Z  C. I                       continue;& V: \8 @3 M; d( c/ d; h2 M
                  }  G% f. S/ t5 p3 Z
                   if (digits[i] != 0 && digits[k] % 2 == 0) {
7 B0 T% a: L* P/ q  F1 c, A6 W                       result.add(digits[i] * 100 + digits[j] * 10 + digits[k]);
5 _" O* |5 e; _% P/ P                  }+ b+ J) t+ i. h3 L
              }' L1 I* P, U" D9 Q
          }/ F5 x1 X! ~: L: |, F% n0 c3 N
      }8 Y* R7 _. u8 [! ]3 J
       int[] arr = result.stream().mapToInt(i -> i).toArray();
; K8 G: r/ Q) P% H6 |/ S2 C       Arrays.sort(arr);+ L% s) s" y4 E. F! B
       return arr;! m" f+ ~5 E6 q5 ~, I: B; L  Q
  }
8 V/ E& b2 {& G# j9 R5 Q}" q" I: `3 J- V* ]" D# f: R
6 g/ o3 B; }( T1 p6 L8 @5 m5 S/ w
5 g& @' T6 U2 V
【 NO.2 删除链表的中间节点】3 |' ^4 t9 Z- P1 I9 \

; e( \8 s( @. b; v解题思路
5 v0 h2 p9 O$ ^2 Y, q: Q3 D快慢指针的经典题目。
2 n4 K* J6 R; K5 m% X/ r3 [2 K' n: v
代码展示
1 B$ B& `/ u9 r2 Y& x' _; K/ @3 ^9 ^& h' [# {6 H  f4 N
class Solution {( i: {" J) C2 c* O( T
   public ListNode deleteMiddle(ListNode head) {8 W- C4 K. D$ w
       if (head == null || head.next == null) {
; b* V# Q+ D( X$ m+ u           return null;) H' d+ W% U. ^0 J1 P
      }7 C) c$ q! h) ^( ~3 j! T3 E
       ListNode slow = head;
# W- }3 ?) q/ g! d       ListNode fast = head.next;
' a6 x+ F# K& f# d; u: U       while (fast != null) {
$ E& W8 D3 K! Z$ Z8 n           fast = fast.next;
( _+ {+ b6 y( J9 a3 q           if (fast != null && fast.next != null) {
( X8 {1 u$ |" Y, G               slow = slow.next;! u9 d" p7 |% V* `
               fast = fast.next;. P! e8 I. w9 R* [, f. y
          }
' @: S, B& z( R' ]- Q3 e      }$ O% \5 J7 h. f' F
       slow.next = slow.next.next;
1 M+ y- g; [% \9 ^3 m) n" {5 w  b+ S       return head;
# C: P( {$ x8 n1 N0 q+ n& S8 {  }
, d0 Y. K% v1 X6 k+ i4 I}2 k9 }6 N8 m5 a1 h, O

% |. \3 V, e5 F$ s! ]+ n2 _1 b+ L
- `& [' ?9 \3 {! J& _/ f$ u【 NO.3 从二叉树一个节点到另一个节点每一步的方向】
  W% [4 s9 X" [3 w  y4 F, P0 q9 k9 r5 n, P+ @# C
解题思路
* k, a! L4 w# \; o分别求出从根节点到 startValue 和 destValue 的路径,然后删去公共的部分,再把走向 startValue 的部分全部替换为 U 即可。+ O" ]- x) q! y3 |( S) N
  G9 E2 J3 T: U0 c, ~8 p- T' r! j
代码展示
/ W4 R* R. J! E. G7 |# j0 n" o9 B1 f4 Y- W7 n
class Solution {
, C, m2 b8 L, K% z   public String getDirections(TreeNode root, int startValue, int destValue) {9 |" P5 V# G; Y6 w, s. A, l# F
       StringBuilder start = new StringBuilder();
# v" i# B/ k/ J( l8 ]+ I- o1 T3 |6 A       StringBuilder dest = new StringBuilder();
' C* ]# x2 }3 G" f" V4 x$ }; N       getDirections(root, startValue, start);
  D; j8 O& H$ L) z       getDirections(root, destValue, dest);
! n! ~8 Z$ ^5 M       int common = 0;8 h8 n# ^5 S; k" l. W- V# y% |* }  c
       while (common < Math.min(start.length(), dest.length()) && start.charAt(common) == dest.charAt(common)) {& O: ^" f8 U4 H+ d/ C3 E
           common++;
9 Z9 E9 W. p- ]$ q* H      }
' @8 j6 o5 B3 O       if (common > 0) {
7 f3 U0 I# O5 g3 R, q           start.delete(0, common);
( o% U+ }9 c. ]( B" K6 k           dest.delete(0, common);! y$ R& x& o2 f1 ?3 S7 D0 ?% E3 L
      }% \/ B8 t4 M- I$ A  G" [7 h
       for (int i = 0; i < start.length(); i++) {' C/ Y% K; J6 E
           start.setCharAt(i, 'U');! ^6 A7 S$ N% d$ P# ~
      }
# e/ `6 \( ~  @( Z! w4 I' Z& D       return start.append(dest).toString();+ S. M8 J# C( u, h5 M% `; D
  }; S0 R/ A+ y# w3 h% D
. K, D- U; L: q, g
   private boolean getDirections(TreeNode root, int value, StringBuilder sb) {% O  p; l4 z8 a
       if (root == null) {0 w) S7 y2 g; I! P% D$ e
           return false;
1 a0 c9 K" u. }  H, H      }; o& \0 t$ t. ]+ k5 E
       if (root.val == value) {5 L# g8 g' o( {6 m
           return true;1 L9 b3 Y5 X2 A) |: k% ~
      }4 w( Q9 ^0 n8 U: W. p- E
       int len = sb.length();7 |6 f& I1 ^1 E
       sb.append('L');3 `: R9 p& C& f8 W8 b
       if (getDirections(root.left, value, sb)) {
* O* ^1 i+ ~  W2 j2 h" f$ X           return true;9 R* m' e) H% c% }# Z7 L
      }
/ L: Y# }: [  M' |' L3 u7 x       sb.delete(len, sb.length());+ L& `/ f; T' g& g, ~% {
       sb.append('R');
* p, s  Q* s3 O9 y6 c       return getDirections(root.right, value, sb);
  d4 X' }- g& y9 G) C! S# s  }
, r  I8 L) M, L& k) u) W}: I* G: N2 I. @4 ]

) |) \: ?; V% X4 j! L0 t
6 i  O( Y8 C6 I3 b2 c" j【 NO.4 合法重新排列数对】5 H) E9 N- S' z$ P' f0 I. r

" ^' K, \+ j+ w解题思路
, J" |+ C/ u0 w6 i有向图求欧拉路径的模板题。9 m; U/ T/ S4 \8 p2 n

0 c( P$ j' m1 W8 d代码展示
& o6 Y7 F+ {; d( g& X9 K( B) {
+ k' L1 I. W4 y8 i# A7 B% kclass Solution {9 \# q/ }. C5 \, q" w
   public int[][] validArrangement(int[][] pairs) {4 k+ s8 K& y. E0 Z, s& x/ n1 v( y, D
       Map<Integer, LinkedList<Integer>> graph = new HashMap<>();5 K8 j9 v1 t& I3 a2 p
       Map<Integer, Integer> degree = new HashMap<>();+ F; G8 J/ ]6 i+ P. e3 C; H  r8 `
       for (var p : pairs) {- k9 T# D. c" I( x' f5 _
           if (!graph.containsKey(p[0])) {
9 Q4 |& H2 [- L/ f- W               graph.put(p[0], new LinkedList<>());" I! }* o: R/ b# J, }# S' z
          }3 O1 `) s1 o+ E6 x7 m# H
           graph.get(p[0]).add(p[1]);' M+ s+ Y4 l! e5 k/ S$ [
           degree.put(p[0], degree.getOrDefault(p[0], 0) - 1);, B0 e1 y  c8 k4 d/ T- ?
           degree.put(p[1], degree.getOrDefault(p[1], 0) + 1);  Y) v% [" D7 j- u
      }' F# _3 L6 ]' X% S% {5 q: G# N
       List<int[]> result = new ArrayList<>();
5 V- g  {  B3 F) B9 l- I       for (var e : degree.entrySet()) {
9 N) \; n2 O, J; V           if (e.getValue() < 0) {9 D3 L' Q& U- T5 ^) J* Y8 ~
               dfs(e.getKey(), result, graph);( r* @" {3 n4 r2 V( J2 g$ M% n
          }3 O! ~, V8 Y( F. m
      }; e8 l: I( j' s4 }% ?/ s
       if (result.isEmpty()) {+ J$ @; _, Q  _! \3 A. S1 h
           dfs(pairs[0][0], result, graph);
$ G' ]  C6 T7 R: Q      }
6 [6 i8 y: L# i5 ?       int[][] arr = new int[result.size()][];
& N  t  v6 a* V9 y) w7 I+ r. N0 S3 B       for (int i = 0; i < result.size(); i++) {, ]  O! v1 S; c/ w" \) V
           arr[i] = result.get(result.size() - i - 1);
( n$ [* k/ X$ e6 Y8 J8 S, g/ B      }0 j6 y) n$ D' {  b2 G' Q1 r
       return arr;: q# F, z3 C# i3 Q/ `5 R' h3 r. m
  }
! m. O) R/ t% R' |1 z" r) W$ A4 ]: Z9 `& i  l" o3 ?$ \
   private void dfs(int start, List<int[]> result, Map<Integer, LinkedList<Integer>> graph) {
0 P" s$ P$ ^/ ?9 ?1 s# u  L' P       var next = graph.get(start);. \) b! r6 P# k/ J! L
       while (next != null && !next.isEmpty()) {  U) u2 J  G/ \' d( j7 P
           int to = next.poll();8 ~8 w5 x- {& `+ C
           dfs(to, result, graph);
/ G* U8 n/ G# B" G; c- f           result.add(new int[]{start, to});
% A9 j+ I* @$ m  G5 x% I% g      }
  ~7 [: K5 P7 u8 t! q  }6 r- G8 m! {/ n2 Z- o% B6 q
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

登录 发布 快速回复 返回顶部 返回列表