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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Count Integers With Even Digit Sum】
; t* }8 G4 r6 T7 d
5 g3 h% V1 ?2 r/ W+ c6 h% Q解题思路
+ v' F! }  ^$ ~' p) J1 w& r- F签到题,枚举计算即可。
7 b0 R6 \) N9 z" B/ G8 W& _3 K7 N
代码展示2 d( t7 O6 J) T7 Q
3 ?- ?; U; N7 M0 i6 M! d' o7 v
class Solution {1 l3 y+ k5 L- F  Z9 o6 w. _- ?8 ^
   public int countEven(int num) {
- x# A, L/ a" k0 l9 h7 [       int res = 0;
( h; Z' x/ m& J$ v, p: k       for (int i = 1; i <= num; i++) {7 }7 V/ `: j2 r9 e
           if (digitsSum(i) % 2 == 0) {
7 e. q" e3 a5 _3 x' r; y               res++;
8 y4 @# R1 U* [          }4 m9 c; ]5 H& {  U
      }
( t$ J! f- H+ Q$ e- u5 \5 [       return res;* s$ q1 L' M3 j& p7 e$ h
  }
9 ]7 d2 F$ E& ]* x# u/ h9 ^* U4 E
   private int digitsSum(int num) {
3 \' d7 H! e# J5 v8 s$ w       int res = 0;
. e# Y4 U* k* W6 F1 A       for (; num > 0; num /= 10) {
, U, P0 K7 N5 E( c& x! h           res += num % 10;
* a; e  G0 u" B* x4 X' ?      }: d* \# m: a( S
       return res;
  T7 j% T- }. _  }+ H/ {' g6 ]0 R$ w4 `! D+ ^; d* h
}
# J0 Q) m, c2 G" U; e0 n6 _# d  A
. Y5 e9 H" d0 v1 l
【 NO.2 Merge Nodes in Between Zeros】
- P% {( ]8 j7 a. m# h$ I
0 o$ @( q, Z6 X5 l$ u8 _$ ~$ ]* x" W解题思路! ]' U2 E$ z. s# S5 h* `4 B
遍历链表即可。
& y( l9 P% ]& v) p: k4 o# [+ I+ a9 O7 O" [! N2 H) S( q0 r; O
代码展示2 q' l5 Q, A8 u2 S
2 f9 Q2 U4 Y  f; n0 N- b
class Solution {9 a9 u0 A2 b! c+ J' b0 J. T. k
   public ListNode mergeNodes(ListNode head) {
) t" q2 G( ^2 G2 F- ~8 o       ListNode res = new ListNode(0);
7 I$ T5 ?3 b1 f/ S6 Q       ListNode tail = res;
0 i6 L5 K: `+ K* t       int sum = 0;" w* M* t* ^4 N# U' c- P' R6 ~" ]
       for (ListNode cur = head.next; cur != null; cur = cur.next) {2 E3 B$ n4 Z5 L
           sum += cur.val;, e! V1 h  _4 c  M( R/ A
           if (cur.val == 0) {
6 m! B# L+ k0 z               tail.next = new ListNode(sum);
% U( ?$ l1 S, \2 O' d" {               tail = tail.next;0 a' ~0 t0 J" K- w6 q' [4 X
               sum = 0;( H/ A% z5 ~9 X
          }* B! ^6 ~" B( Q1 t; u
      }
! `+ P; ?2 o- a# z. d       return res.next;
$ r" a$ Z8 N2 O; Q' m  }
8 h$ _- C$ V7 E2 x1 n/ h}& c7 G3 i. [; A0 u# ?! y9 Y7 m
0 u4 E. W5 n' z* W
& _" o3 G& L" S0 l' z
【 NO.3 Merge Nodes in Between Zeros】
" h% N. q" P; [9 r, ^1 T3 |2 ]2 m' R- Q( G$ p7 D( E1 m2 k: x8 L
解题思路
9 `: S8 Z( x& \2 D3 T5 C$ e& \1 t/ [注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。+ C# [- q6 l( m2 U2 u

! v! K  O8 d. X- \) W5 Z代码展示& d9 F" ]7 V, U5 z/ k
  ]* k4 D" b0 ?4 x3 v" t. K
class Solution {
, u& D8 c" x% z) v+ h0 b+ P0 Z8 n   public String repeatLimitedString(String s, int repeatLimit) {4 x% ]' ]* x* w
       int[] cnt = new int[26];
. A* X, `+ ?! S7 F+ O0 Q       for (char c : s.toCharArray()) {1 t8 w  N( M. k$ w
           cnt[c - 'a']++;
7 O, d  u8 m% Y$ r3 v2 |      }# T8 c+ p5 V; x7 H2 ~. r

% J; F+ N8 w2 R- ?  s1 l# |       StringBuilder sb = new StringBuilder();
* J% q/ M; k- K/ @- f5 J. V       int repeat = 0;
9 B. e. J9 x3 z4 c4 ?; m       char cur = 0;! |( I6 {  m" @2 x4 ]
       for (int i = 0; i < s.length(); i++) {# Q% t4 P+ Y4 A  W; w
           char c;9 T& g9 L9 Y. m' d% U( B. B
           if (repeat == repeatLimit) {- I) ^3 B6 T# M; I7 g; w
               repeat = 1;( p% M' U% P- ]5 t* L! x; \
               c = poll(cnt, cur);
, x" K1 ?, a# I2 S$ L( [               cur = c;3 t+ }, j+ `! O3 \6 y3 p$ P
          } else {
2 V1 m' _/ @; l               c = poll(cnt, (char) 0);, t7 ?7 @0 E# Z6 w" B+ u' x
               if (c == cur) {
/ b. U: r) b0 e) J$ |6 Y                   repeat++;2 s) |2 A7 j4 O! w7 P( N
              } else {  C% G* j$ Q& B
                   repeat = 1;; n* d* g2 N, c/ K; i& ?6 X& ~- T; T6 \
                   cur = c;
. N- h0 j+ {- C8 O! L1 I              }
* j7 }5 K( H- @! G. U          }# l1 N. V% p: l+ J; a
           if (c == 0) {! @) n' D) a" o, A
               break;
( Q5 H3 i$ i6 A1 W          }
' ?" {9 }1 K; J; D) N' E  T2 C           sb.append(c);
2 b! k0 U- x  J3 ]6 F      }" \: ^$ r  ~) ]' a! V
       return sb.toString();' o9 r  X# c4 @4 S% U6 Z
  }+ F0 [7 L9 X3 D8 Z$ R# M9 _+ O
- U8 u% M1 E. c" \; n1 C
   private char poll(int[] cnt, char not) {
/ L  U4 M: \7 K/ S2 N       for (int i = 25; i >= 0; i--) {+ w- N- [- d  l4 Z& }
           if (cnt[i] > 0 && not != (char) (i + 'a')) {
/ _$ e% @/ {, P$ l               cnt[i]--;! m+ {4 I. R3 T. f0 I3 G' z1 x# d/ I
               return (char) (i + 'a');4 r  Z- ^4 [  b0 |
          }" d% `0 M7 ]2 p, w& |* ?6 q7 S2 h: S
      }
1 ]# c/ m) F5 F( R* l       return 0;
, H/ X4 a9 ?* a0 e- B  d' N  }
1 U8 O7 K, h: X  u; q}
# x4 h4 W* }  U) ]
- z+ A: _2 [. L2 j) z3 D+ n# Z, C- Y  F
【 NO.4 Count Array Pairs Divisible by K】# q# |5 ~/ p& _' O$ C8 I  ~3 @' U

4 ~. N3 F' n3 l+ y3 ?解题思路
$ ?: f, H- W5 a  I5 P预处理转换成最大公因数,详见注释。
. A" @9 E9 a  Z$ t+ N$ Z6 d, A8 d7 n, H
/ [, P& Z2 C3 Z' D! M7 Y代码展示; q# q  D# ?4 {- _5 L

, Q+ |& P; {& D& V! ~$ r4 V- nclass Solution {: S# M# a2 X. |( k( C
   public long coutPairs(int[] nums, int k) {3 d# Y! \( d; g4 H' P- U! w$ f* U
       // 将 nums 转换成与 k 的最大公约数
& `0 e; `6 ?3 |5 ^' q       // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)( a  K( U) O3 i% M8 w
       for (int i = 0; i < nums.length; i++) {& o0 w" H# a/ t" j
           nums[i] = gcd(nums[i], k);
, _2 }( M) `; a      }+ L+ i. z" T/ W+ K, Z3 I, S
       long res = 0;. o9 ^+ N- o& W1 a, K4 Z* Z$ u
       int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数
& s1 r5 ^6 G- o6 B& _1 b       for (int num : nums) {
, E" z6 v) ~2 g8 V" ?           // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数+ D# Q, ~  }* A1 M8 \: z6 Y6 \- K
           res += cnt[k / num];
1 y9 S) q- f& R2 C
$ C2 u. P8 N& B8 X1 s$ {; {           // 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++, U7 l4 v9 B) P2 r5 K$ G
           for (int j = 1; j * j <= num; j++) {
0 H( O. w  S6 B: a               if (num % j == 0) {/ [8 D8 H9 z$ O, K
                   cnt[j]++;1 |- X8 G9 x5 X' w3 C5 n' x" m4 p. T, S
                   if (j * j != num) {
  R  n  o$ _; o5 A' L                       cnt[num / j]++;. ?* W: c. H  j
                  }, J# z2 q' Y  D7 v: h
              }( r9 T4 a, e/ n: s- t. B
          }
: @/ D: o4 o  r6 a7 e3 f      }7 K& F8 f0 E0 g% N0 G( d/ v3 a
       return res;3 {! ]2 U" C7 L& {% s8 D
  }' J1 v) N- L" g- h3 v+ z

. w2 S- d# ~7 F9 Z   int gcd(int a, int b) {% }4 }" I6 L* Y0 `' l( K
       return a % b == 0 ? b : gcd(b, a % b);! u, ?5 j* U; w
  }# h; l. e! ^2 G$ Y% l
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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