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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Count Integers With Even Digit Sum】3 [# V) |$ u' D! Z  ~& s, Q/ q
+ Z0 R2 m1 K5 H% X7 t
解题思路( L* I) H% D; |2 v. a$ I3 G
签到题,枚举计算即可。% K" Q5 n7 S" `9 ?
  N  a' q& e- x5 E
代码展示
, V! }0 y& N: R. \6 P* f
& z' k% ~3 X+ h- |. iclass Solution {
" u+ o$ n: }% C5 S  n   public int countEven(int num) {! D1 Z4 ?& B1 L* ^
       int res = 0;
# m# r/ h2 ?, z/ U6 J; ]       for (int i = 1; i <= num; i++) {
: n+ [9 K' `2 ?9 h% v- L           if (digitsSum(i) % 2 == 0) {5 `- n; ]' e- O# v, x) J5 ^3 a$ y
               res++;
5 u% ]$ W% P; y9 o          }0 C& ~; ]! E! b
      }. s1 ?2 j# r3 q; ^7 x. L
       return res;6 E* C+ b/ X! x# Y
  }
, C. J% O8 X1 C- s# U
8 O; m; I; c6 q   private int digitsSum(int num) {
9 [7 \1 k: M: W       int res = 0;
" i( D4 f; t, e* q% Z+ r( \       for (; num > 0; num /= 10) {
: a7 r' p. @. F/ H' d           res += num % 10;( H' A0 E# H$ H% m
      }
/ G$ Z6 G; z$ E/ C       return res;/ `8 a9 ?$ b- ~; i. p% r/ b: H; A
  }
5 v# y8 i4 p; p% i; ], K}7 s( k& K0 q5 i- |' Q
0 u# Y1 t; j+ a2 L+ ~' g
- I5 G6 g, F3 o6 G
【 NO.2 Merge Nodes in Between Zeros】0 d+ Q1 o' w4 t7 X% H$ ~
( a$ l1 @( F! X( ]& |1 p6 M
解题思路
, Y+ K  y: ^& i9 I遍历链表即可。: G. a4 l; j( W$ f4 K" A: F

6 C' [& q' v5 `" E代码展示1 g2 d" K9 {8 |9 Q4 j" E

3 q- x* p" l7 B% \. w% Z$ oclass Solution {! }0 L, W( r3 h; x* Y+ q% ^
   public ListNode mergeNodes(ListNode head) {
6 D0 |) f9 c" ^; m, h       ListNode res = new ListNode(0);
" y0 q8 R" W  x1 p- n2 ]8 H# K       ListNode tail = res;; s3 l4 Y3 O1 L# ~4 p
       int sum = 0;
. U3 A7 U1 P" r9 Y- f4 ]       for (ListNode cur = head.next; cur != null; cur = cur.next) {
& ~- T2 h6 H0 d8 K. v* @7 N* ^, {! u           sum += cur.val;' o7 }4 k8 X+ R9 J$ Y8 `% ?/ _  U5 D
           if (cur.val == 0) {' p  C0 f; E1 X/ I0 B
               tail.next = new ListNode(sum);, u. {& }& f. C5 A1 ]) V
               tail = tail.next;. x; J5 k9 S; ]  n
               sum = 0;
# d- Y8 W6 d  a- [7 I% g# A          }
% @$ w, J7 Z4 z. Z8 d/ C      }
1 E" E9 ~/ C0 X$ n- ~- e+ i       return res.next;. f- h3 F2 K$ B! [0 Q& l# S& Z9 ~
  }
0 r) G& H: `7 f% l% m# h}
; u2 q1 G/ F/ i2 c8 ~8 B/ v3 j9 K- |; r; V
/ \% V1 @# P5 X% p7 n8 i3 U
【 NO.3 Merge Nodes in Between Zeros】8 ]+ l  i  r$ {1 w# N

6 Q+ i1 ?% \$ D" m解题思路
: n. }: ~; S  G, V注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。
! `) `0 f( f! h$ E' }* K2 }/ c
/ b/ C3 D' Q3 l代码展示( C4 D" s( T$ x; l8 x

: F" j# f3 k& h. Rclass Solution {
  T* D, c3 \, \+ t) |   public String repeatLimitedString(String s, int repeatLimit) {6 `; o- X4 ~8 m9 X3 }8 n
       int[] cnt = new int[26];
: w, I! Z+ n) q1 M0 w       for (char c : s.toCharArray()) {
- A" B6 j+ r3 ?           cnt[c - 'a']++;( r, [" `7 [& |5 m5 h
      }9 u/ W/ K  X' t, O/ ^4 z" I0 M+ p

+ B4 b; p: L& f3 L! k       StringBuilder sb = new StringBuilder();) l- s( @% C4 m, i4 r
       int repeat = 0;
" C) F  ~8 t" h# o% V       char cur = 0;
8 H9 I" ^) U9 e       for (int i = 0; i < s.length(); i++) {
6 k$ o( B. z& k( q5 @1 x           char c;
/ P1 Y9 q: s- t0 t. m$ k/ {3 m. S           if (repeat == repeatLimit) {
4 ^1 _* x* V& G! e               repeat = 1;
' O5 Z& ^4 k1 c0 ?2 g               c = poll(cnt, cur);% }4 G8 u% @9 v* x5 j
               cur = c;
; Q9 K9 l7 S$ ]. W7 j$ @) H" Q. ~1 p          } else {
: ]2 }9 s3 a5 ~5 I9 J- ]8 O               c = poll(cnt, (char) 0);1 v! n# i) O# c- p) q, p
               if (c == cur) {
7 }& M- t6 U; v                   repeat++;7 B& ^% i2 b  v
              } else {. a) e! H" N4 x
                   repeat = 1;8 I, e7 s. L4 T3 n5 y' ?6 z
                   cur = c;, A' x$ A' n4 _% s# x) V8 M
              }+ E$ [1 ?7 J3 {( X7 n$ [8 h/ z" \
          }
, F* a' F+ W) q, e           if (c == 0) {+ g8 G) t" h  J6 ~
               break;
) }4 L7 g$ [  p* C( ~8 s          }
; b: R, z8 E/ z' Q7 E2 m( f5 K           sb.append(c);) ^% v3 d' a+ L, T8 H4 f) D9 E
      }  T- l/ x' w/ A% B* I5 I5 S
       return sb.toString();
. p; }2 L0 R/ N. n5 W; u  }
6 D- x) `8 C8 [- ~( P7 L% u, o
' ~  u: c/ N( u) g& J   private char poll(int[] cnt, char not) {2 x) R- n+ a& P; K  N: x0 t7 {  Q9 Q
       for (int i = 25; i >= 0; i--) {
; b* Y" B- K4 U& w2 t           if (cnt[i] > 0 && not != (char) (i + 'a')) {( {7 N) L' V, R  o" h( [& q+ U
               cnt[i]--;+ p1 y( V* d, N+ _
               return (char) (i + 'a');
$ E& v8 z5 T. u' [8 C          }
7 |  y9 o: a: N7 v, p1 Q" i( m      }
! m0 D0 m2 Y: u1 j3 Y1 a       return 0;
4 M" p( a# g3 Y( z/ I  }+ F$ B/ R7 B! ~3 C" p4 l& L8 Z
}  i7 z9 x* K! q) |& B5 c
; f/ ~4 D+ G, n( M0 E% n4 A
) G. p: T7 D- B: H( B+ c
【 NO.4 Count Array Pairs Divisible by K】0 f- _  V- J  H
# \; g( A1 i8 \* M5 t  c! ]8 p
解题思路
; i* i8 ~" e4 i6 b+ X% M9 T8 P/ k预处理转换成最大公因数,详见注释。8 Q, m* x$ q# N+ G% I/ R
" s, n/ P! d" c0 _( D- C8 E. i
代码展示
# C. p+ j1 `7 i" }1 P- C( A$ D( n+ K
class Solution {5 s4 i2 O5 a/ m9 a- t2 K  \
   public long coutPairs(int[] nums, int k) {
/ M6 X# ]6 J7 m. R       // 将 nums 转换成与 k 的最大公约数4 ]0 I& {; W  r' `* X2 b7 l
       // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)' R) D' W" \/ `% a! n7 Y
       for (int i = 0; i < nums.length; i++) {
. l; c5 J, R0 A0 S           nums[i] = gcd(nums[i], k);
1 R; n' I% {, X$ T) H" ]      }
" q; w5 i( \7 E0 h7 A       long res = 0;1 f4 i2 ~0 ^: q0 k
       int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数
5 l% Y& D3 H) ^* a  P9 I- @5 ]; b       for (int num : nums) {! D  N: x, Y* w& B
           // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数
2 |$ M/ ?1 l5 J6 B: @) E           res += cnt[k / num];0 P. @: ~- x% b& _! Y

( u; }: ]% ^1 l8 Q, _8 U           // 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++1 p5 T* M/ v8 [4 v, o
           for (int j = 1; j * j <= num; j++) {
; @5 _! Z+ ?) ]- [3 g6 S               if (num % j == 0) {6 \- o& E. m6 Q5 p. N
                   cnt[j]++;
( M1 j/ V" a$ O$ Z5 v3 a                   if (j * j != num) {! X% ^3 Z3 q  o4 x/ v
                       cnt[num / j]++;0 f" w& Y0 U* O! ~: f) Y5 Q- N
                  }; t4 w8 E/ x' _) g" B9 S; w$ ?
              }
- {+ p- c2 l9 w2 I8 p/ ^          }
1 L/ P8 x2 l! [& H' _" |      }$ G% L# I7 ]2 j) }! X5 ?4 ?
       return res;- z! s! l! I- }# N! z
  }
- m& n' H& C& E* s% [& {" e9 {" C' u. y
   int gcd(int a, int b) {5 I3 J9 I9 x9 I6 I
       return a % b == 0 ? b : gcd(b, a % b);* ^9 o* O7 S# m4 `& F% ~/ q
  }' ?1 ?8 p8 O: e9 w
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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