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

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

上岸算法 回复:0 | 查看:2518 | 发表于 2022-4-6 21:14:31 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 转化时间需要的最少操作数】& s1 w0 E, g$ ?

+ T6 i8 q& \. n: Y4 h2 @解题思路
  s$ J6 j" z7 M! B6 e& y$ Q将时间转换为分钟数更有利于算术运算。6 Y% O6 D5 O) ]. T4 d/ z; J( I4 w

: y# i! ~3 n  `* a0 t代码展示9 D. o. ?9 g& z

7 c% R! u! `; Z( g. v3 d4 \# |class Solution {1 U7 }: n3 _# p4 c! V5 l# c0 X
   public int convertTime(String current, String correct) {
+ Z+ }' V9 K  `       int cur = toMinutes(current);/ f( u3 \, P+ I! v  [4 _. F
       int cor = toMinutes(correct);  v3 b) o3 E/ x) R- T
       if (cor < cur) { // 第二天,将 cor 加 24 小时
4 l8 c  {) l) V* ^4 w& O2 k& E) T+ q           cor += 24 * 60;
% s  s  a7 O9 L% X4 z" J! c) t      }
: M' P. |, z, h3 ^       int diff = cor - cur;* S/ G" ]% Z! R# R" S3 V
       int cnt60 = diff / 60;1 c  v' @1 l: ], y9 ?
       diff %= 60;/ `7 T" I& L& r5 ?) Y9 H0 b
       int cnt15 = diff / 15;: X6 Y3 ?5 }9 _; S
       diff %= 15;" }- ]# h6 u5 C( ?7 f
       int cnt5 = diff / 5;+ v: ]& R6 S0 n# C/ J" K/ A% A
       diff %= 5;5 a8 S' B+ q+ b1 K
       return cnt60 + cnt15 + cnt5 + diff;! r7 c& C0 J' i5 y
  }1 w( z; Y0 e4 n8 K4 C5 \8 ?, d
  S( @' x& R, [6 W6 H8 v, _( R$ R
   private int toMinutes(String time) {2 i7 @! X7 K, S
       return Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));
* s/ `, P7 E! s/ y" k; Q  }9 ?, J# _- M+ X  _( Q
}/ R9 i8 X! [3 p: }( O8 F
' b5 ~6 T. p- Y4 \; {- w% f; U, Y

( H: f7 t: r) D, R' |9 F- A【 NO.2 找出输掉零场或一场比赛的玩家】
5 C" M3 O$ M& {) z1 i' z4 j1 Q$ o# s; W  ~* Y2 y$ Q
解题思路
) T& T& C: \4 v0 o使用一个 Map 维护每个玩家输掉了几场比赛即可。0 I$ F  I5 \" M& S- s1 o9 Q
' r, l1 f# `& p, c
代码展示: @( Z5 u- }1 k3 M# l
4 d8 h: v* P+ B4 Q% X
class Solution {! ?, c4 S4 y: R! s/ ~1 O
   public List<List<Integer>> findWinners(int[][] matches) {
' g. k. `7 v* l" A4 a8 j       Map<Integer, Integer> loseCount = new HashMap<>();
5 D. c; o1 w. |# h+ f% w4 A       for (var m : matches) {7 A* E  [( i" x/ J( O: Z
           loseCount.put(m[1], loseCount.getOrDefault(m[1], 0) + 1);
8 i$ Y. }) E$ }; `; _      }2 k/ ?% ?& J; m# J2 h  y
       List<Integer> res1 = new ArrayList<>();
8 L- \! E* D3 ~/ l; u# \) R2 T       List<Integer> res2 = new ArrayList<>();: A9 M3 h  G4 I
       for (var m : matches) {; D, y' _' O* n4 p; D) W' l
           if (!loseCount.containsKey(m[0])) {
& h2 M( s9 W# Z) a               res1.add(m[0]);
: N, e1 G) p1 H( @, D               loseCount.put(m[0], 2); // avoid duplicates
/ s$ x' t  }( S8 p$ Y8 F          }; R+ P# }1 P2 }- X( m6 [
           if (loseCount.getOrDefault(m[1], 0) == 1) {
. @+ W' B2 q/ e3 T               res2.add(m[1]);
6 K7 A4 ~0 I9 c! r4 V1 h/ A) j               loseCount.put(m[1], 2); // avoid duplicates
/ q( _: H, V; I/ g5 I1 r1 T          }6 `0 x3 k9 |6 Y5 n$ N
      }  _6 h1 m- {  `; I
       Collections.sort(res1);$ {* {9 D1 \  O. j  n/ r$ S$ ?% M
       Collections.sort(res2);
2 [3 p) r) y& n1 Z$ n- o1 M# ^       return List.of(res1, res2);" ?6 J) z1 S& {1 W& X; i" I
  }, ~* s) C: u7 {8 J% ~
}
/ Q0 H) o1 u6 H3 T: u0 ?
: c& Y. G% p2 @, M% @2 B/ t# |6 L, x: ]% e* j0 L& u% l9 X' }$ P
【 NO.3 每个小孩最多能分到多少糖果】
% x& t& R" m) _' s( g1 f8 @# y, L0 i) L
解题思路
& D/ }. Y  T& y1 G2 b% M典型的二分答案题目。' A5 L- b7 k8 \/ [, E

+ \4 C2 L) E9 [5 _; s; A3 D% Z代码展示  ?! r) \, q8 T: T
, V) \3 T4 y1 J  q0 E9 N

( S1 \2 J0 _; q! m) ^class Solution {
& O7 w. N7 z; D8 k6 T   public int maximumCandies(int[] candies, long k) {
+ e; I( X; t8 L7 ]       int l = 0, r = Arrays.stream(candies).max().getAsInt();" o4 p1 ~- X: w2 w, k2 L
       while (l + 1 < r) {
7 k3 _) O  r$ H$ s5 |8 S: ~, D           int mid = (l + r) / 2;
: R% S2 t- H, j$ v& V           if (check(mid, candies, k)) {
8 e8 D* M+ R; H. G               l = mid;
6 g9 S8 Y' @7 Q0 L6 x/ t          } else {% Y2 C  f% U$ `7 W4 _
               r = mid;
8 n9 A# h+ P' e, G+ [          }
" \- F; s9 D5 B5 H& t6 S$ p      }( c& E7 {; B" ?2 H3 X- J
       return check(r, candies, k) ? r : l;
2 B% l0 J1 j, |  e1 I' R# p5 K$ @  }
& l6 K7 O$ F) I/ A8 R9 k
* j$ F9 Z$ i/ j, P9 q   private boolean check(int r, int[] candies, long k) {: n& P. ?6 W2 {* ^/ B- V1 L2 M! B
       for (int c : candies) {
1 Q) {$ E. K0 N: w- U8 G1 k+ b           k -= c / r;
) W+ _5 j: I6 b( z      }
0 d- i* e$ d0 V+ A; p$ p       return k <= 0;# y1 @6 r4 E" R; w% _5 k; g
  }$ E( @/ Q* b% v, d/ `! @
}& @. A7 }* K; J
6 L6 r4 w  N+ k

9 d$ p3 {5 d. n: @5 C【 NO.4 加密解密字符串】  X. P5 G0 |! |6 ?) B' u

: j3 b% N4 @) ?5 ?' _2 D  i解题思路
' a/ @( J7 f+ b5 R使用 Map 储存 keys 和 values 的映射,即可完成加密。& H- d2 M7 U  ^7 l' N" ~2 |( d# Y
. M9 Z: i2 l' {7 R6 A
解密需要借助 Trie 树判断当前解密的字符串分支 (因为一个密文可能对应多种明文) 是否属于 dictionary. v2 m$ p8 \7 Y0 c

% c( d  S6 r. f. r8 e5 @9 k代码展示
2 y! s- Z3 E5 `
0 ~8 b  n( J/ }9 k6 r8 Aclass Encrypter {" K7 W+ E# p/ K, {1 |1 d# }

% U3 z( i, ?7 n& J9 D3 f+ Y   char[] keys;' P1 u" M( H4 d* ^, K
   String[] values;
6 c1 R) \+ R6 y: V* X   String[] dictionary;
9 p5 v" P3 y2 E( s
: p$ u! a) j* j8 Z# Q7 Q' Q% K   String[] keyToVal;
7 g7 \: P( A" b6 u+ A   Map<String, List<Character>> valToKey;
' _- H" S/ _- k4 p2 v5 e$ m0 w0 x" \* m   Trie dictTrie;9 w1 E2 z, T) `" ~( g- M- U
  r, D& D% n" f! B
   static class Trie {' v8 ?' {1 @( t& I
       public Trie() {* H+ k8 t- @2 x0 N
           root = new Trie.Node();
, B" O$ d" P5 s( `9 q      }& z  |, u9 e: O; y
# d" w" X. n; ^* b
       public void add(String word) {+ D! o$ x1 W$ [3 Q
           Trie.Node node = root;
6 l% U' ~0 [, x% ?6 ]' u% A9 l           for (var i : word.toCharArray()) {
, b/ R  a- ]- W' H: `# P0 ?               if (!node.children.containsKey(i)) {
# c! F; n& X; x                   node.children.put(i, new Trie.Node());
2 w# m2 y3 p6 z: K& v, Q              }
+ G7 N2 Z4 x) ?7 r  l! @$ z) o' Q               node = node.children.get(i);5 }1 ]5 B% o" h0 S; k
          }
! U' v6 E. ]" M  G4 N( g: v, p           node.isWord = true;% i3 E" P* T( f( ]; H
      }
* R- X( G3 K) c. i  D( d" [6 {* L) j+ D
       public boolean containsWord(String word) {
. t% E! H. z: q. O! x. j. t           Trie.Node node = root;* a* v% n5 u$ Z9 Z7 ~3 ?
           for (var i : word.toCharArray()) {/ y. q4 c* L: D. ~" w
               if (!node.children.containsKey(i)) {% A8 `, ~; c& h( G: o3 |* o
                   return false;
4 o+ G1 Y# {4 |& t, H              }7 Z* o; [8 z( b& q2 r
               node = node.children.get(i);
' ^# j' U" w7 ~' f' E8 t          }9 I/ S: N: r/ [4 L8 C. _, w
           return node.isWord;$ e* d) N2 B% `* v
      }
# L. w) u9 L. c" i' Y$ b- k/ d! z8 y2 y/ ^" Z( h  e' b+ T( Q# [8 V
       public final Trie.Node root;
/ A; u  R+ T1 M; A" V
- \8 ?% F. v+ Q; R( v) b. L       static class Node {6 ]5 U( T' U8 E7 m4 Y
           boolean isWord;
# B  L8 f# m) S% c) m           Map<Character, Trie.Node> children;( u8 B! t1 }" U  ?& x1 N% C

" y- x+ r! f3 \3 d: o) ^( s           public Node() {
% ?7 w' x' h$ D$ M               this.isWord = false;* B  A! k$ P9 |1 h" `2 ?
               this.children = new HashMap<>();/ s) ~1 }' ^, @. ?& R0 S
          }4 f: s# _' w. C1 q, O' }7 E- I
      }
; x% w/ F+ ^& r8 ]- j* _  }
5 O# S2 u1 x# s. q; v. r
4 Z' P( f, q/ B- I  q  T. l% @   public Encrypter(char[] keys, String[] values, String[] dictionary) {: U' ?6 @% E0 a9 U+ F7 P
       this.keys = keys;: V/ a1 F& x) O8 J/ ^
       this.values = values;/ @  h$ h/ M% c. N- e* `0 `4 t
       this.dictionary = dictionary;
) E: v, ?( ]) d/ A, @. X       keyToVal = new String[26];2 M; c3 D( x# X6 `
       valToKey = new HashMap<>();
7 _; {0 f/ ^0 D0 y       for (int i = 0; i < keys.length; i++) {
2 @" W2 x1 X" _4 Z           keyToVal[keys[i] - 'a'] = values[i];4 e( U* o+ N' L; r: _
           if (!valToKey.containsKey(values[i])) {) e5 Q+ l, G4 I) S5 P
               valToKey.put(values[i], new ArrayList<>());
) n. \5 s( X# h. H4 X/ S; l3 b- c          }
/ w+ n* D- G) ^, Q5 l1 O6 D9 R           valToKey.get(values[i]).add(keys[i]);. A2 I3 I. T- f9 @
      }
1 s# O' E( A! L5 Y; e( i- W       dictTrie = new Trie();
$ e9 u/ E& s# \% F! m       for (String s : dictionary) {8 L9 u; a# F$ r. Y" u) V
           dictTrie.add(s);, s0 D2 r( ^; @8 c# ^
      }  D/ z4 c3 J: [; w$ D
  }" d7 I" b. _7 ~" K  p6 P% T
) U+ h0 v9 Y- j" F) R
   public String encrypt(String word1) {, u+ o! e9 G% y( Q
       StringBuilder builder = new StringBuilder();
. j2 Z$ o1 Y9 X# Z* A       for (int i = 0; i < word1.length(); i++) {; ^7 m( h, q$ I7 w7 |. X
           builder.append(keyToVal[word1.charAt(i) - 'a']);
. ^1 q% h. X8 |* \& D" Q, {# b      }( X  b, I* s- @( G  L
       return builder.toString();
; _" R- o) P. f  T  }* y, u# z, G$ W( Y) H. G# k0 |
4 L! W+ ~. d) J2 x2 }
   public int decrypt(String word2) {8 ], v. \8 S9 n) X7 |5 Z0 k
       return decrypt(word2, dictTrie.root);
- `% [3 I8 z* Z- P$ g& p& h  }
5 t2 o# T3 P; Z; ]8 d+ T$ J' c
1 ~% R7 H) G% r: j, ~- d   final private List<Character> emptyList = new ArrayList<>();
  h& h8 V( @3 b3 j& y5 K! d4 o
1 T" I  ^! c9 r1 b, x$ m. D4 ^   private int decrypt(String word2, Trie.Node node) {
, {. S  @- [2 h  f( @       if (word2.length() == 0) {7 s' N; N: H& u- G/ Z
           return node.isWord ? 1 : 0;
/ c" S: \& V6 {1 N0 Y      }. M. ~0 Y; k3 q( a- L8 ?8 ^
       if (!valToKey.containsKey(word2.substring(0, 2))) {# ^2 Y' Q, c  a( T
           return 0;
+ y- B1 M* o3 H% z$ A- f      }7 {  d- p; ~' t4 @
       var cand = valToKey.get(word2.substring(0, 2));
* g+ @$ R. y3 w1 N& L       int res = 0;
/ W: b6 b; _( d" l9 l8 ]/ a2 M       for (var c : cand) {
' y+ t' E6 i3 r3 [7 m; D2 u           if (node.children.containsKey(c)) {+ N/ O- C0 f; E; i8 I. L
               res += decrypt(word2.substring(2), node.children.get(c));
  W5 ~  ~& [0 ]  W- c0 `2 Q2 G          }
5 V4 @  ^' T$ r      }
) L7 u; Y# k) K; q2 m2 G       return res;
3 x& K# @7 T$ U) M/ @  }
7 P- d+ t9 S6 E( v- U. B}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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