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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Count Integers With Even Digit Sum】" s6 U2 N1 l  u8 b0 a7 ]3 B4 q) ]
7 L0 V/ a1 g1 f2 `( ^: h
解题思路" `- T- ~0 o; S( w, C
签到题,枚举计算即可。
% p! e6 E* V( n7 g$ X% m1 M9 X; t* ]0 b# K
代码展示! \# k0 r0 t2 q, V, I% S

6 E! o7 Z# Y6 L; G0 ?* D& p+ B! kclass Solution {- _9 ~8 G+ `4 _) L& a( f+ l
   public int countEven(int num) {5 p8 J, F( M8 x3 V
       int res = 0;& R$ k9 j& I( x' v4 Y, `/ I, k, J
       for (int i = 1; i <= num; i++) {
2 _/ g' Z( N6 u# p           if (digitsSum(i) % 2 == 0) {
. U: B3 O$ |) x3 P* k( H               res++;/ \0 ~$ I6 I9 c  m0 V+ Y# |9 g) ]( n
          }5 `% u0 B1 T. I! t0 X
      }2 v* D2 {, r* q# h
       return res;
8 r, U6 d0 i; {4 z! o8 L  }
1 v# H( U/ \- i+ _3 O7 n2 j
" P, o8 V9 O6 @9 q1 K  E$ |5 B0 f& T   private int digitsSum(int num) {
; J( N- J5 i3 p9 _* }  ^8 Z       int res = 0;
7 G/ G1 \3 W4 C( Q0 x2 P       for (; num > 0; num /= 10) {
' q$ c5 `, x; t9 K& K* p9 C% M           res += num % 10;5 X5 @. F- y% @" K7 i
      }6 V4 |3 Z, k9 m: N% @0 j
       return res;
# q4 [; ^0 x+ L$ O  }$ X7 S' \$ J9 ^1 l
}
- k) e/ c  Z! E
% g( [4 t4 a8 x7 L$ r/ k" I9 O
% C: J0 W; T4 E3 b6 ?1 d' F【 NO.2 Merge Nodes in Between Zeros】+ A% w+ z( Z7 i6 L+ L
! k) J9 `  H) Z. z9 S& d" k# q' @
解题思路- _7 ~2 V7 c  X8 Y2 u: I
遍历链表即可。* w8 V" B/ _4 o$ G4 T' r% Q

; N1 |: B; T: @- U代码展示
/ g# A$ K; h' z1 r, W5 O1 T! a) p) r6 x0 y
class Solution {8 f( c- K) ?+ k: @
   public ListNode mergeNodes(ListNode head) {
, |- h# |7 C$ f- ^& K7 a( Y( U       ListNode res = new ListNode(0);
  n, g/ ^, i% p- W* x  w# V       ListNode tail = res;
: {1 P" ~& K( Y) `6 h0 y: C0 f- v: X       int sum = 0;' K) I7 i# t# O
       for (ListNode cur = head.next; cur != null; cur = cur.next) {
' [6 \( z6 W0 K! m4 _2 e           sum += cur.val;
/ ?. ~$ F" l3 M. R6 P( x) j           if (cur.val == 0) {
# C  H, r+ [3 J0 Q               tail.next = new ListNode(sum);& V# C, f, D( \# ]4 J2 q
               tail = tail.next;
1 l1 ?2 m% N: @+ F% D6 S               sum = 0;
- E8 S7 x. J6 j* v' n! [" K          }
3 q: A% R6 Q/ \( k9 i8 `9 s' H      }" M( V0 U7 Q4 i  _# D; |" D5 q, c' k
       return res.next;
  k0 o! M3 r% z2 B5 _3 G0 P; O  }% V* B# T( z0 ~
}
7 S, {; T3 y: Z5 n0 Y6 m3 ]$ g6 ?8 h: i
" G3 }. K: C# b& L) g
【 NO.3 Merge Nodes in Between Zeros】
; L$ w7 Y+ G* {+ z3 w: p6 ]5 H+ u. u# [" q7 ]
解题思路8 B0 |4 p5 m1 z* _3 T* p
注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。! D& t6 l6 P) G# M  k
! O2 J& r6 o7 o
代码展示
0 J: Q% |6 L7 B5 u5 C
% _' D4 {/ O1 j3 Z0 Sclass Solution {
8 d/ }) q. s- x   public String repeatLimitedString(String s, int repeatLimit) {
1 I+ Z+ ~8 p' s' }" s0 K       int[] cnt = new int[26];
+ Q2 f) L0 [; D       for (char c : s.toCharArray()) {8 P6 ~" D  y5 ?) r3 y6 j! h
           cnt[c - 'a']++;
9 E0 ]. o: T1 X: ?, d      }
, m# v! e( H0 i4 w& w; n+ Z5 z( h2 s: s0 X
       StringBuilder sb = new StringBuilder();4 p) E1 S5 l( s
       int repeat = 0;
5 s5 M2 c0 F0 w3 Z& o0 i       char cur = 0;1 x3 _7 M9 ^3 s9 s4 @; r5 e
       for (int i = 0; i < s.length(); i++) {- \' f2 q% {8 l
           char c;
  i" L, `+ m0 B; `0 n. Q5 H           if (repeat == repeatLimit) {
) f  M% b$ |0 r& I               repeat = 1;0 w% Q3 v$ @0 o# G* E& J" E
               c = poll(cnt, cur);
- n) l' u+ Q" X1 r3 s# s2 e               cur = c;
+ p5 Y( Q" @- S1 p4 e7 ^          } else {
+ F: X  I7 k* Y9 u1 G, H               c = poll(cnt, (char) 0);% C, r; D6 j7 i- c8 o$ g
               if (c == cur) {
+ l  S0 F: U7 m2 `4 f4 C                   repeat++;
" ]+ ^5 h' L, i1 p4 R              } else {7 W" }! m4 w2 f! ?6 s. b" i
                   repeat = 1;* g( X& f) P( h& F6 D. J3 F
                   cur = c;
4 J  {8 F+ c  p              }
3 H" c% U( {# |' W+ B          }
. Q) c7 e) C$ W; ?, K           if (c == 0) {: \1 ?* z7 f  k/ P
               break;, G, b1 S2 Z6 v, r" q) b2 P, M
          }) D# ?# J3 c1 y  t
           sb.append(c);
+ I6 @4 y0 O0 o7 D      }4 v6 P" e& e: L+ I
       return sb.toString();) C4 [2 t. n3 {* k7 n& v
  }8 X, x+ \$ j: z& c

1 m, d  R0 {! e% g! n3 P; l9 n   private char poll(int[] cnt, char not) {; O) A0 j8 h* u1 O9 I
       for (int i = 25; i >= 0; i--) {
# L7 P  o) P1 H9 M0 P           if (cnt[i] > 0 && not != (char) (i + 'a')) {
9 \4 L' N" b$ T' U. S# m( ]/ g               cnt[i]--;: {+ f6 k! d+ Y/ Y! N/ x1 s
               return (char) (i + 'a');8 |, L) B& c5 e1 Q. I
          }
9 `1 u* p! L, n4 |      }
$ S1 c$ G5 C& {  S4 {       return 0;
7 H# z6 U! E, u& q- W' L  ^2 y  }
) f1 C' o1 K3 [  z$ N0 j}
; h4 d' K$ K5 Y2 \' ?# y4 o# r' o1 R5 l# B, T" l- b# k8 T

6 p4 f2 j+ T6 K" o9 s9 s( k, f【 NO.4 Count Array Pairs Divisible by K】% ~% W( N/ [1 k! x8 ^

- P" L0 U- e# J% s9 M解题思路
3 l4 l" [, o  g- Y- H! {) ^预处理转换成最大公因数,详见注释。
1 M* {# [) `* z/ h9 R! Q: E5 V: N/ Q
代码展示6 L8 v5 C4 G  e; A$ A+ ^
. E, ?  U% \% o& w
class Solution {- I' h& A' k& Z3 a0 P3 ~
   public long coutPairs(int[] nums, int k) {6 `$ }0 L& S% z6 v: y& B# c
       // 将 nums 转换成与 k 的最大公约数
0 X5 h1 H3 B* R6 [) {8 T       // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)
5 _" K8 H6 u" ]       for (int i = 0; i < nums.length; i++) {
! K# a* V1 z' q           nums[i] = gcd(nums[i], k);
9 F& Y' J$ B: I0 t      }
) s/ j# ~0 W) f       long res = 0;
+ T* e( ]3 _: N       int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数
- j, j# G* d  V: |6 s) Q       for (int num : nums) {
, P: c8 L3 I  Q0 x6 }           // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数
/ a, R  z7 d. e! X5 v5 o6 y/ E8 D           res += cnt[k / num];
$ D& l% q- t- _$ T! I% w0 S3 {# _$ F% A% e5 U
           // 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++* I# b% f  p) o! l2 ?7 T* \' q
           for (int j = 1; j * j <= num; j++) {' c3 d' A3 d6 t9 G, c% H6 Z, r
               if (num % j == 0) {3 G1 y# M& A2 J( _
                   cnt[j]++;
& W1 G$ S* G  g, Z! o6 a$ h                   if (j * j != num) {
6 x) R4 z+ V& h                       cnt[num / j]++;7 m: d2 J& |% p7 z+ y) Q
                  }
; c" E; {6 e$ I              }
% I+ A. b0 ]+ q. ]& J) I$ c          }. A) L% R/ {& F( G# j
      }
7 |6 K8 j1 Z  E* e- x       return res;
2 j+ C+ E8 [$ a& A  }
3 g/ a! o! y2 A8 J. P9 i
3 x8 j+ Q5 \+ _/ X# I+ B' T   int gcd(int a, int b) {. O& h, ]6 G2 v
       return a % b == 0 ? b : gcd(b, a % b);! K! V: `( P& ]* q* m' i# b
  }7 E6 A3 t2 R6 z; E) r& a
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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