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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Count Integers With Even Digit Sum】
7 O4 G! r# S3 t+ E4 h. }  ~
2 ^. v; X2 ^  K1 ~* m  f解题思路0 V) M9 W7 ^1 M
签到题,枚举计算即可。% S5 F+ l1 a2 p7 r2 x) P
' ^. _- ?5 B5 k0 b. Z
代码展示3 U$ M) |% L6 W" S! f
* H& @8 ]4 D" e0 G4 I; K/ J8 G
class Solution {- d# y% N/ B- c- h* @) ?
   public int countEven(int num) {
- y' ^7 Z9 Q. N' c( B) R       int res = 0;2 F/ K9 L- S: y5 I5 R) S7 ^& y& m
       for (int i = 1; i <= num; i++) {# K' c- W' c$ _: y7 X; T
           if (digitsSum(i) % 2 == 0) {
2 f4 t- O! G- F               res++;
& W) A( c$ @7 B; [) T. ]3 Z  e          }* Y; G: H4 ~* [, O3 y! S8 n
      }
4 R% j* i3 c. @$ z" p, c& Q7 `       return res;
2 Y$ ^9 A* x  b+ k* U+ M  }2 b% l& r0 m* h. U. ]' `

- S' @+ m/ p1 |$ F0 s   private int digitsSum(int num) {
9 r' O* L; R) m( _9 X! C% _! }) n       int res = 0;- X) i( e; H& V5 R1 ^
       for (; num > 0; num /= 10) {
5 Y3 L2 W+ h9 X! m. n           res += num % 10;
: s+ n1 P7 f( B9 I      }
. {" X0 h9 a# ?" _2 J$ |/ f- F       return res;2 x  T) U8 x/ W* z; t, B
  }+ r. W3 L' g: A; }; m7 R, x
}2 N, O2 O  @3 S( [( \# i

) s! V1 a, [  J* x) H7 ]- y* e! j3 u
  @- b* D& ~1 u# C7 q& {【 NO.2 Merge Nodes in Between Zeros】
) Y5 C! \5 H/ M+ Z* g3 _! I$ |+ \& V) ~/ Q6 F' _9 @; l! c
解题思路
" S3 X7 L  `, `* S  h( x遍历链表即可。2 `; b9 E& J) @* m. s8 p: i

" V0 g+ a9 F3 Z5 J代码展示  ?2 l' X. a; R+ L- U# h/ Q
. o0 S: L' M' G0 K- N0 C6 I
class Solution {
& z& {8 r4 L' o0 n4 G3 C+ m% G   public ListNode mergeNodes(ListNode head) {
" K3 ?- i+ q5 U. }4 C       ListNode res = new ListNode(0);! {% I& o3 o  T8 S# }" v
       ListNode tail = res;
% D  e9 ?: v" h+ h! w0 c, e" S       int sum = 0;: T0 v8 Z$ \2 ^6 ?6 E
       for (ListNode cur = head.next; cur != null; cur = cur.next) {4 V2 l( b7 `9 ^0 }
           sum += cur.val;: P5 ^9 }' P5 N; O
           if (cur.val == 0) {
! x5 E( k2 L/ R/ K3 i7 n- O7 p               tail.next = new ListNode(sum);
' G+ P* `) M" s( o+ }7 y  ^8 F" r               tail = tail.next;1 l1 g. F" q/ U( h
               sum = 0;
3 p" C! h7 N0 |/ l/ x: s- ]! C6 @& ^          }
8 O3 n" f/ }5 w) U( p, V1 W      }
) E& F$ v4 R* e4 T% b* h8 G       return res.next;4 L. E8 V7 _) q& w! t; G" z
  }
( S5 |. I9 o, U! V  z}
  W  M6 g4 T, P( g6 d8 T4 x) o; a  d1 Y0 N, Q, p2 U  h4 \
4 L$ z! K0 S1 `1 O0 A
【 NO.3 Merge Nodes in Between Zeros】, R! P, ]& G9 e2 q2 E3 U" f

( B3 W3 y( ?1 m4 J' Z解题思路5 `# |5 F) W  g2 p: k% l! y0 d' t  t
注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。  S: n3 W2 D9 ?7 S; v) I0 V

5 ?7 N& w) Y2 ~- f7 j: F8 ^, z$ S5 l代码展示. k! I4 A% O: Y

) p: ^0 ]! J( l% z' Tclass Solution {" b& n( [5 I6 m6 a' n
   public String repeatLimitedString(String s, int repeatLimit) {3 k: Z- L0 S9 Z# a
       int[] cnt = new int[26];
6 j9 K6 _! U% b       for (char c : s.toCharArray()) {
" ~% O0 U+ d2 r, k2 W           cnt[c - 'a']++;
' ~5 H, a- Q- \; @      }
3 D1 {. R: q8 s( X0 {+ w. k) B+ @+ _( Y( B" r' r# D2 A
       StringBuilder sb = new StringBuilder();
4 `$ l  v4 F9 ~: N! t       int repeat = 0;
* [0 H( q) E$ _% o0 x. V$ `       char cur = 0;8 i2 ]6 H# p* p4 T9 B, H
       for (int i = 0; i < s.length(); i++) {
1 A6 I7 k- @" t, N           char c;% g/ C- l1 @- Z# }4 q) s
           if (repeat == repeatLimit) {
3 E# A9 {2 {4 F& L6 X               repeat = 1;$ \7 _' r! o  Y1 @
               c = poll(cnt, cur);
6 [$ |8 L0 K; C3 F# H! R  g2 P! @               cur = c;
5 N# J7 C& a. D2 P          } else {
# {$ {4 x( H. o2 ]" Z: Q( K; `4 O               c = poll(cnt, (char) 0);, s5 @) @+ c* h8 J
               if (c == cur) {
5 `- N, s' x* }                   repeat++;! z9 @' y: j2 C: t
              } else {
- n! t4 {, a, q1 p7 D                   repeat = 1;
$ G  v% \& M/ M8 f; {                   cur = c;! `0 [' \6 X/ [' [# g
              }2 G3 y# t6 y5 l% y0 p0 W) D
          }6 `8 ]8 H8 D6 C/ O' M
           if (c == 0) {
( \2 H) h+ X5 W/ m) j  l' o$ r               break;# }* N) R* H0 J' e
          }$ g4 }! O- }, \: Z
           sb.append(c);
' h- J) a4 H+ p0 ~: s+ f      }
1 f7 X9 Q6 j% {3 S' Y. {' h# |       return sb.toString();
8 T5 D! Z4 i" E6 C  }, W' [& u2 S6 G3 h+ |) |
) N* m# |) g! |" F# B0 N# G- K
   private char poll(int[] cnt, char not) {" c# w, V: b3 ~. g2 Y: _
       for (int i = 25; i >= 0; i--) {
% Z$ M/ x6 V# S: ^+ o. E) [           if (cnt[i] > 0 && not != (char) (i + 'a')) {
/ ~+ n( V. |* R# N' V               cnt[i]--;
4 K, A/ k/ ]- D+ _5 G8 e2 i4 A               return (char) (i + 'a');
  w0 ~/ t) q4 v5 @- f          }$ o  o, w6 h# ?9 m; h
      }+ T5 W. H/ ~7 [' q
       return 0;
3 H- C! r$ O2 r# U' k/ K3 H  }
  l  J8 ^1 R# |: x' O}3 e7 d; T  Y8 _$ z& S, Y3 Q

0 Z9 x" v( [. i; K1 V1 I; w( h
8 _; O! g4 I! f8 {0 s! W【 NO.4 Count Array Pairs Divisible by K】. P# A2 H4 {# ~& x3 S

3 m! N2 I5 R- A# J* A/ @解题思路
3 J3 l* N- i4 r8 g, O0 l预处理转换成最大公因数,详见注释。
6 `4 \" C3 y0 N' a
+ V# M: k) h+ q7 j, L" h6 |代码展示
, N1 D/ u7 D9 w2 W8 ~% k" X2 Q
2 @. B; U% P* X, Pclass Solution {
3 u8 r. C8 h; U5 I   public long coutPairs(int[] nums, int k) {3 \2 w4 P* ^6 K6 u
       // 将 nums 转换成与 k 的最大公约数
) x) u  b! L, l5 ^0 ^       // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)3 x. }4 ^2 {7 R' ?/ I+ n
       for (int i = 0; i < nums.length; i++) {
" N5 R/ O  \$ i& a' d4 I( s$ ~3 _           nums[i] = gcd(nums[i], k);: \  k# V) L" C/ ^- g
      }9 }& L( J/ f  v3 ~, f' [6 q! q# \
       long res = 0;# O6 i- t) E8 u/ J9 i
       int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数: b7 M4 h' \( S" V* K" R
       for (int num : nums) {
- R, _, d, `! I* y, f  D           // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数
! Z! i( N; k7 P           res += cnt[k / num];
; W# Z5 x  J) m& ]# w
9 t$ ^; k* O$ n& v# o           // 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++
. f6 m  b: u6 V0 o. m% y; |7 q' t6 i           for (int j = 1; j * j <= num; j++) {+ v* p/ t. z( K* p, ?& ]0 U  o1 V
               if (num % j == 0) {
  C( v; f* `) S, p                   cnt[j]++;; w( X9 {% J: o/ G/ G
                   if (j * j != num) {
/ X3 ~) ]2 d' p8 a* @                       cnt[num / j]++;
+ V& E! p4 I8 `7 ~  J: e2 s                  }
' B' A9 ~' b3 r3 {2 Y3 ]% B. L' G              }
1 l2 ?+ l( |  ?) t( r2 W- C1 p          }
  }( b; \8 E+ F7 w9 z      }9 C5 v  @( z  ^# W
       return res;( o! Q. S6 e8 T- }8 u$ h
  }
6 b4 i5 w1 H4 l( D1 n: h! {
0 C5 u) y7 w) m+ B  L   int gcd(int a, int b) {. g( w" J+ X- \7 C6 s, {! }7 D
       return a % b == 0 ? b : gcd(b, a % b);3 h0 e, R4 ?" c  b/ t& u: C
  }
7 D, C# z! h: u3 u% X}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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