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

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

上岸算法 回复:0 | 查看:2499 | 发表于 2022-2-20 16:59:15 |阅读模式 |复制链接

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Count Integers With Even Digit Sum】! z) b; B8 y; P  w/ X
( o1 z0 N, y/ C% n
解题思路
. S6 a7 O+ K( i( V4 A签到题,枚举计算即可。
( F6 K6 k* d8 L0 }2 H& u
2 h3 |! \( ]5 a, H! |/ Z$ T; H9 V代码展示
- p9 V  w/ c$ r; N+ K: Y% f. B0 W( V+ W1 a7 j! u
class Solution {* l" k5 g. f# h' g9 c
   public int countEven(int num) {
, `. {% |+ }6 L0 G) T       int res = 0;
) a1 t2 O, V& N. l       for (int i = 1; i <= num; i++) {5 N! w4 m3 x; b1 l
           if (digitsSum(i) % 2 == 0) {$ \5 k* X7 H; [5 ]& p
               res++;
) y8 b8 b3 y8 o+ X( j. i7 j. O          }4 Q% V; c9 V/ L# s% C+ G
      }5 v. b7 q5 c& r7 v) g5 u% ?( ~4 O
       return res;1 [5 J( g: E6 X. H2 A8 @7 e; ^+ d5 I1 R
  }4 O- r2 l7 c9 |' q6 C4 ^( N. a/ B% T

- r" ~6 N/ z* D0 q   private int digitsSum(int num) {8 X: _/ b  p3 |  r% T
       int res = 0;6 f6 _/ |8 m% L5 P; L
       for (; num > 0; num /= 10) {: \2 E' h$ A4 p
           res += num % 10;
1 k3 z5 h6 h4 U3 s: H7 _4 ^) j2 ?! Q      }
+ C$ I  Q7 {6 a       return res;
+ E5 P7 V, w/ V9 A* X! {# ^  T  }
9 u8 w. i! a- K9 K# n8 K+ y3 l}
7 s9 K) G7 v- A5 Q9 P0 j+ B& L; d

* w, h2 J* Q2 G【 NO.2 Merge Nodes in Between Zeros】
+ N  I: s: Q% [: L/ H; Q' c( C
' M3 C- I( z5 {$ b# E. J0 e9 h解题思路
/ Q0 n9 V' F$ ]2 z遍历链表即可。
3 I4 E" K7 w" ?- V- t+ }: R$ S5 \( o6 `% ~+ }! L' d
代码展示
# U; b+ x! O: T( l6 ]5 Z
, K& h- T5 x9 E$ h  M1 v3 nclass Solution {
" F8 }3 N9 ~8 [; `/ U1 t! \   public ListNode mergeNodes(ListNode head) {
: E" ]$ U' H+ k) ~       ListNode res = new ListNode(0);. O) K$ G% H" |( p- @
       ListNode tail = res;
! {1 G. A0 U/ B: ^$ F       int sum = 0;* E. r9 ]& N% N( G* U
       for (ListNode cur = head.next; cur != null; cur = cur.next) {
! [( D: R: ~' D6 u9 A           sum += cur.val;, ]9 h, m" t4 O$ m
           if (cur.val == 0) {
& z7 v6 Y- s  o# M" X$ m7 G4 W; C               tail.next = new ListNode(sum);) Y; q' `8 M! H
               tail = tail.next;3 t- p6 m) ?8 @* b7 V
               sum = 0;6 b, |+ s0 _$ w6 w  [! J& `  e
          }, w0 [" W  M7 o: H" }
      }
% w5 E7 e) {3 t1 b, E/ U2 I       return res.next;
1 {6 P3 H2 b6 O' o& c. }  }  v$ f' p. j0 j$ G; R3 Z! k
}/ v7 ~5 j& _' c$ v7 i

4 F$ W- F& M4 u# z. l1 J
3 c. Y. f+ C- }( C& V【 NO.3 Merge Nodes in Between Zeros】6 r; `: Q# l+ s+ U

, r% L8 @: d2 A5 Y/ H0 p解题思路9 O# g' W) y2 ]5 v0 f
注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。" P  u6 Y: j8 h  f0 o# s1 k
- C  l3 S( @7 C" G) P+ @
代码展示: v. k# ~# @% p! n& f  Z; U5 ^
& O) m" W: W6 t8 v# D  J" K5 N' l
class Solution {
6 h; N5 Z2 m$ {6 T$ H   public String repeatLimitedString(String s, int repeatLimit) {: H/ \% N; y$ U& b( U% t( ^
       int[] cnt = new int[26];9 U( A; o5 X2 Q: A" m; g
       for (char c : s.toCharArray()) {3 e: p& c) ?5 k
           cnt[c - 'a']++;
* y8 E5 |# @- @& i) ?- H      }
$ L" J. T; p& |' g1 o0 }; W3 m  }
! d) N2 ~. I% ^       StringBuilder sb = new StringBuilder();
- W" V& Z5 @" i: \0 x3 b" K( [       int repeat = 0;% s9 A4 p6 T" g7 Z) E/ B
       char cur = 0;
3 c4 t, b- \; F- g  o       for (int i = 0; i < s.length(); i++) {
. f" `2 |/ ]: {& V9 z5 v# C0 Z7 }1 j           char c;
7 j, a& H" i! L# v  @$ V1 s$ C  r           if (repeat == repeatLimit) {9 O7 l$ |: G% j" g6 N$ R  h4 O
               repeat = 1;
2 D9 g& k! h6 Y7 K' }! `9 Y               c = poll(cnt, cur);. c$ ]0 J1 L& {% |% V# l( D
               cur = c;! i+ m% p% p8 |5 ^4 ^9 [7 B" K4 t
          } else {
9 U: \4 r. v5 i' g' I' y5 q               c = poll(cnt, (char) 0);
8 Z1 x+ S/ G, Z& D# l               if (c == cur) {
$ x. F5 j6 R+ T1 U8 }, R; ~                   repeat++;  l5 y$ t2 H5 K4 w. T
              } else {5 W/ {8 Y' V$ @
                   repeat = 1;& }" S; g6 r  j1 y) {2 m1 a
                   cur = c;3 |6 L: i6 b8 f
              }& k& Q: n" A( h  s
          }
/ j. R; ?# l" e           if (c == 0) {
! n& c( w" I8 `9 p8 d               break;- d0 q9 F5 R+ O7 Y5 i. R% m* b
          }
3 e8 h$ f  }0 M) }( A- @# N5 j           sb.append(c);
9 n" O  h7 F5 @      }
" t4 h" l% m& c/ E       return sb.toString();
, q& V  J9 t0 u: W. v( e7 ]+ r  }
8 t) ?4 S' e: M/ c, K
8 F' V! e* s" n  R0 q7 d   private char poll(int[] cnt, char not) {
4 s: t! i9 {$ |/ @' }       for (int i = 25; i >= 0; i--) {2 Z, ~- \' d6 K* R9 k! }4 b: r1 Y+ f
           if (cnt[i] > 0 && not != (char) (i + 'a')) {+ l! [: M9 a) [+ }
               cnt[i]--;
, }  @# y0 [2 a1 Z6 C3 `               return (char) (i + 'a');4 G0 }- B6 g6 _; M& K) l. m
          }( C/ t" u$ [7 i% l4 r, V: L  I8 S
      }1 _3 Z- O% z1 W: r" O5 A* m. a
       return 0;* t, ]4 v  w4 v' }5 \) N0 Q
  }
% d+ l: r) i  C0 D: C( ]# i& O}2 g1 `+ A2 e, u& `1 \5 k
" ^  q: p3 l* N- d4 g5 x
" a0 Y; A+ I4 U  l4 @/ B4 J
【 NO.4 Count Array Pairs Divisible by K】5 \9 M& W2 q8 E" \" {/ n; y+ b

) f5 Y/ I4 s" V# \0 g3 p% \  L- \解题思路
; k8 B5 t( f4 R/ Y/ ~预处理转换成最大公因数,详见注释。' M4 V7 e5 L  K
. }; x3 Z/ F3 g; @
代码展示2 f4 L2 V+ D6 U) L2 b- E: s
, ~& c5 q* y: A% M) d
class Solution {' c# Y2 j5 f4 L5 z
   public long coutPairs(int[] nums, int k) {+ f# V# M; ~) T) @& m; b5 ]+ X
       // 将 nums 转换成与 k 的最大公约数
: K' O2 i3 c, f4 ~( O       // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)5 T% h; K  m( l" a" H0 T; r2 U
       for (int i = 0; i < nums.length; i++) {) K) ~5 N) Z1 ?7 {3 r; }6 f" t
           nums[i] = gcd(nums[i], k);; f/ f0 I* H8 N5 y' Y- H4 e0 {
      }
1 q: `, M8 `' ]; |) W% k       long res = 0;
, N$ T9 |: v2 ]7 X5 e  v/ `       int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数; [! G6 O- r7 J# P2 l# G
       for (int num : nums) {# J9 S; Z8 p- b0 i0 `
           // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数
, Q4 v  a1 ^4 [/ @( e% m% y+ M7 z- o           res += cnt[k / num];
' ?! H+ L* K* c  A! f( t4 `2 j* h* H# Y8 F$ }
           // 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++
. u3 P" [+ L7 E! Q2 t) ]9 r7 K2 h           for (int j = 1; j * j <= num; j++) {; ~5 h- v3 o4 E: Z* N" y$ e
               if (num % j == 0) {
8 i, Q& L- e2 l+ }                   cnt[j]++;% O" K% H  |/ X2 p9 N
                   if (j * j != num) {
) ]% c7 l' k8 A& E8 ]                       cnt[num / j]++;: q  n% g& r+ O9 D" V2 c) L+ H7 T
                  }
# p1 m& ]  j- G% J8 Q5 }) ]              }
$ A) L6 s9 U: G4 m; f6 _0 j, _          }) M# X8 z9 q. L/ P
      }  p% @( U8 }6 j& m! U% w( X- Z
       return res;  }: M1 b& X+ P7 N& |" Q' o
  }
: a+ ]3 ~3 L3 X; p: g. q# ^# W; N# j
   int gcd(int a, int b) {, w9 i3 `& ^3 W; {7 h
       return a % b == 0 ? b : gcd(b, a % b);
5 ~& T& r+ ]1 b  }9 n1 o6 \6 J. D. ~2 d9 O- i
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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