找回密码
 注册账号
img_loading
智能检测中
置顶:如何加入2024届新生微信群

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Count Integers With Even Digit Sum】; W' w9 e; _1 z

: d" ]  W/ o6 `5 _解题思路4 C9 t! d6 z; I; l; A
签到题,枚举计算即可。
& o, y3 X* Y( f* O2 ]9 V; Z, v; D
! |2 H' u0 [# T" M代码展示) U& h' t5 E. C/ I  g" M! o& V
: n1 X1 t: I6 y4 i/ p! l3 J0 l
class Solution {
0 I  j! B% R0 t- K( |& f   public int countEven(int num) {: h# L# C  R' j3 Q0 y4 t
       int res = 0;
( |) t8 |$ J4 n, L- x) w* q       for (int i = 1; i <= num; i++) {& M: H. w$ Q8 |3 I- _' d& q7 Z4 g7 A
           if (digitsSum(i) % 2 == 0) {* d8 R: }7 ?8 A/ T! @) H& p
               res++;: o, K5 x# Z! {" R
          }7 _) p* W7 n% t
      }
5 y% V3 Q1 k6 Z& X% w       return res;
" D7 r  F/ ]' N# K; t0 b# ?3 F  }4 g! A* C* f, e

4 A+ w" ^; Y. G& _- l9 U# O   private int digitsSum(int num) {
! Z6 T/ Q! Q  V1 ?' B& @$ J       int res = 0;
5 I. z7 a9 G* z  s+ C% y+ ^- c6 ?       for (; num > 0; num /= 10) {
, u& Z$ E* {. n) p* \3 U           res += num % 10;7 J& W; y: o  H: D2 K" k; \" ]4 Y8 A* Z
      }
. |$ X. M6 l2 W: c       return res;7 v# V8 o: r  n: u6 l
  }
$ b/ V; w. P* `' H% E}+ {; c/ N3 ?2 ?/ L2 o2 h9 q

: ]' W- B! {# q0 J. j  O8 C# R8 y5 u4 L- w/ J* H2 [( B- K
【 NO.2 Merge Nodes in Between Zeros】
) u/ F3 t2 W7 P
# b. H) ~$ R9 E1 A2 x5 q解题思路, o- ?5 A; s3 n3 ^, u( F' B
遍历链表即可。
" {% B0 p( J) c0 H( A
" T  [6 S1 c9 x$ o代码展示
9 T% V* {1 P8 f7 ~6 q
( ~- H" I% W+ H/ R6 i3 I* }class Solution {
$ ~- X7 l9 _+ B) I: Y- h6 e. ?   public ListNode mergeNodes(ListNode head) {9 n( F: u( A! n2 t6 x, T
       ListNode res = new ListNode(0);
9 N4 l3 g2 p" B       ListNode tail = res;" d0 S' }. C" o% C* p0 a
       int sum = 0;1 |( U4 Q$ H$ N# J  V
       for (ListNode cur = head.next; cur != null; cur = cur.next) {. M9 i) X# y# G
           sum += cur.val;
. P4 _/ `4 }2 p           if (cur.val == 0) {# R0 k0 n( W2 U8 `
               tail.next = new ListNode(sum);
9 [* g* p/ @2 z/ o, I               tail = tail.next;1 {9 ]+ @1 F" P1 Y
               sum = 0;7 [5 y- h. ^# t
          }' u/ G+ D/ I9 E- J) A& y4 {' E; N
      }0 F- B( M% l5 W' Y- e6 {
       return res.next;2 n" u# b& M- u) o  Q
  }( i. W' S3 B7 u5 Z, R8 q7 n( W
}& @0 Y' v, b5 p* q2 j* I9 O: p( p

# G. g: C  B2 @0 r* I. x, M. v: @% T& I
【 NO.3 Merge Nodes in Between Zeros】0 g! O: \: O: m$ L

' e- k6 j1 i; y) ?( q; V& q解题思路
' T; {" d3 t1 T# t; M注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。
! v: ^' u' c& V# D& F
  d4 s" L) y5 h/ X# ^2 F) T5 E代码展示
" T7 a: G0 U) _
) L7 s. J" n2 Gclass Solution {
9 U3 [- [# q' q7 V! t# D5 I   public String repeatLimitedString(String s, int repeatLimit) {- a* B6 }" Y6 ~3 e; |* q/ U4 E
       int[] cnt = new int[26];
" D& q' y0 t+ W/ i5 R0 m       for (char c : s.toCharArray()) {/ s, w$ `7 `) w) b( F, N; K+ {5 Y+ v
           cnt[c - 'a']++;
( @( Q. \, n* x      }- \/ m+ E4 b& b9 _: u) m

. b0 i9 N2 g& o) ^' ]       StringBuilder sb = new StringBuilder();# ^8 }3 E( e) m. c# ]& x4 }
       int repeat = 0;$ A, q6 i5 d; X; U' `2 g
       char cur = 0;
4 P1 y- g4 W3 c5 t       for (int i = 0; i < s.length(); i++) {
8 j4 _) Q& ]& M# G3 f: Z           char c;  d& }# o5 V% F" X, c: h
           if (repeat == repeatLimit) {1 s$ M2 T2 ^6 a+ a
               repeat = 1;( E, M& Q' T/ B, s! i1 D1 N: z9 _
               c = poll(cnt, cur);
5 ^0 p: o4 f( A  g               cur = c;/ a! `  e: I. u& a9 i2 f+ ^! ~1 Z
          } else {
6 Z, ]6 ]+ c6 `4 Y- ?' D               c = poll(cnt, (char) 0);
8 }/ S  @) D9 [8 c5 w% j               if (c == cur) {! X3 M5 [1 V: N( \
                   repeat++;
( r6 d  T$ E/ p$ `( c2 D' `              } else {
1 a0 T" i/ U  [6 m% Q* p  x                   repeat = 1;
" a7 K4 }4 t  ?# w9 R9 _% m                   cur = c;
! h% a" D7 J( E7 ]              }3 {  R) V+ x$ Y3 v8 I
          }
9 Z2 y" B( S! k' {9 \           if (c == 0) {, [% i/ g( M- ~" R* o
               break;" ]# t$ }+ Z5 L$ x0 v+ U/ Z) U
          }' J3 _4 W. b! G; ^" ?/ y& s7 C
           sb.append(c);
, X' G" `1 y5 q. t      }! j) V, i, M  S( R0 a
       return sb.toString();
/ W& \8 L# @% P2 s$ ~5 g5 d  }
2 s2 n8 x$ k* y. q; k/ s, [3 a* _+ D+ i3 c
   private char poll(int[] cnt, char not) {
$ Z  ^6 u/ i. T8 r       for (int i = 25; i >= 0; i--) {/ [. o* f- l* A3 s% L9 u# x8 X7 c0 V
           if (cnt[i] > 0 && not != (char) (i + 'a')) {
) m# y3 Q0 n; U4 i1 ]               cnt[i]--;
! Z; B' b& V5 B$ _) K               return (char) (i + 'a');
$ O0 p- O) Q2 O+ P4 Y! L          }
% o3 L; d1 d& O' r. G      }" {$ h# D- u2 g- O% i0 N5 p) Y
       return 0;
. F0 M, V, D+ P, x% P  }
9 L! D/ m/ a+ U# E+ s, X}6 a: L0 W; W2 t
  S( B# q  ~4 k; g, ~

. l" }. H' |, \* t5 H' ^【 NO.4 Count Array Pairs Divisible by K】1 C! Q$ F9 H, K3 D9 C" g
* [6 {; `2 l( [3 c8 q# [' L; k
解题思路
5 F/ W  m8 p8 l6 l  Y( t) V. y- }预处理转换成最大公因数,详见注释。
; a6 a" q& I" ~4 {& U( j' u3 n% O% d" D  |' t6 W9 O
代码展示
" p. _! F$ [* G! M9 _' Z" h9 W
( p, `% Z! P) m1 W4 T( Sclass Solution {
& f1 C3 c0 H2 e* X   public long coutPairs(int[] nums, int k) {1 E; v5 P7 W& l5 p
       // 将 nums 转换成与 k 的最大公约数
- A" L1 ^3 Z5 O# {. H       // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)
3 o" g& Y+ \; |, V2 a       for (int i = 0; i < nums.length; i++) {
9 Y6 F# v2 I8 R1 E           nums[i] = gcd(nums[i], k);" @0 {5 ]2 A# t
      }+ E: O% Q# s: X& z! ?$ T
       long res = 0;5 p" Y( U; w  h8 x9 L7 _: C
       int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数  a' _; V: x+ N/ {8 h9 ]& f3 O
       for (int num : nums) {* Q4 \+ G) T. c7 F) ]
           // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数$ E7 k% L: F. x- A
           res += cnt[k / num];
6 M9 R) N) n7 U/ G) v' c7 U5 c; \- J( x
           // 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++
! M& X% g5 J' W) |: ^           for (int j = 1; j * j <= num; j++) {; }. V5 [+ x5 b2 Y( a
               if (num % j == 0) {; p, d" c% u" e, ]
                   cnt[j]++;- \, X2 ^! {% [+ P9 n
                   if (j * j != num) {2 ]1 E$ ]* s: l  \* }
                       cnt[num / j]++;8 a4 A3 v- v& O9 G7 e: G
                  }
2 b- X0 G9 L+ U              }: W3 O6 T7 k8 c  E4 D
          }
8 q0 K5 {. \3 }, P. N5 f& R5 e      }, y& B& q6 }1 `
       return res;
. g% {" ~. F) [1 F  }
& x1 {- s6 P5 P- t
4 I; Y( u% O1 K  p  |  `( y   int gcd(int a, int b) {3 @# x# ?/ j% Y
       return a % b == 0 ? b : gcd(b, a % b);
6 Q* I8 d, L+ n2 D  }
. I7 i  W  `5 r  N; D}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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