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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Count Integers With Even Digit Sum】
- S, c+ v9 S" {
' r- q5 u" v5 }4 {3 L& X: p解题思路0 |9 b* S' e; A- A
签到题,枚举计算即可。8 l, I0 T" b! l4 u

$ c8 G" F  Z4 u6 z% A! P7 E代码展示, ^9 _9 W3 k  x- t# u3 v( F' O" p) ]
7 ~" K3 q( y0 }8 `, T. U# m
class Solution {# S$ m& e" G. L  B4 I9 i+ m  e
   public int countEven(int num) {9 K/ S' y' a; i  b
       int res = 0;
  n0 S* L0 {2 A' S2 Q! R' v) P       for (int i = 1; i <= num; i++) {
  e: [5 r$ z  S6 _- @           if (digitsSum(i) % 2 == 0) {
5 d, s3 y6 i8 P  N' w$ y! y: S               res++;
$ j. q/ r/ ~# H' n          }6 E& \2 [) A6 O! U, e5 \% S
      }: K' X6 V, \1 {1 @& J! a
       return res;
% |! G; ^. K/ I0 b  }0 f- D( Z8 X/ X( e' }" u* }
* H) q# D+ f2 H: ]1 w+ G9 B/ E
   private int digitsSum(int num) {, y; r2 t) U' Z9 c7 n
       int res = 0;1 z% {, ~' O: y/ w- h7 y% ^
       for (; num > 0; num /= 10) {
" O' ?' ?% Z: J$ G+ n           res += num % 10;
3 ?: L8 n9 w5 i7 Z/ Y9 I& @      }6 {5 @2 X, z5 L+ G$ d3 Y8 ]
       return res;1 @: D- I1 _# j7 {0 {/ H) d1 p. G1 u9 O
  }
/ \2 Q% J7 h9 p6 q( W  @1 A}
) U+ y) T; @; f/ c! j+ N2 i! [$ ^6 l( U( n) H( k

, _1 A' |- \2 n  \, |, C6 ^【 NO.2 Merge Nodes in Between Zeros】
. }- B8 l" Y& `5 E) N  N/ M
; ?+ K9 E+ W  U" o/ ?. R解题思路
$ f8 |1 @$ y: S  L遍历链表即可。4 Z( h. X% c* h: |7 f( ?8 O4 v
8 \! ^( ~- V6 p* H
代码展示+ {$ I3 H+ H% O" L9 c
: X3 ~2 j$ t( Z% L/ }6 W; f$ D1 L& O
class Solution {- y' H  |1 h9 d$ v9 K1 b* f
   public ListNode mergeNodes(ListNode head) {1 ^% L( B4 o# C( |9 O
       ListNode res = new ListNode(0);( k$ r3 p( E5 h' Q  e
       ListNode tail = res;
: p: Z0 o: Y1 ~8 }$ U/ W8 Y1 ^8 a8 E       int sum = 0;
% ^7 I; b' h5 b7 X6 \3 e       for (ListNode cur = head.next; cur != null; cur = cur.next) {$ s  e) C$ |- X2 c6 {
           sum += cur.val;
  n6 W# Q* U% s% o2 T/ y           if (cur.val == 0) {- \2 x' B: C& M
               tail.next = new ListNode(sum);3 p1 x1 Y: e. p: p
               tail = tail.next;" ]( @; ^, `( e
               sum = 0;
. M) V& {" f) d5 A) A          }
+ ~  O$ ~1 I' c( s% g' L2 Y* p1 n      }
" w" d! e; Y2 n: W       return res.next;
6 e# i) Q9 y, ~2 a; t  }
2 P/ T7 u  f- m( W3 |9 N+ o}' p* o& z1 i0 V8 e9 K9 n% Z, ~
, J9 `; w3 k1 i# ]

; K5 o* F8 O' T* M3 K【 NO.3 Merge Nodes in Between Zeros】1 [" o5 Q8 Q7 P& k0 W+ k# x  O5 Z
! @' }( O* x: N
解题思路
5 Y2 [$ Y7 Y; j  i注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。7 ]8 C6 b3 W3 K# C+ L& n

# _0 y9 P7 i7 p% @' }代码展示( Y/ j, P) I, o* ?+ A3 B# k6 j$ n3 j

; z$ e: K* B+ |! e, e  Pclass Solution {2 _/ n" \2 C6 F
   public String repeatLimitedString(String s, int repeatLimit) {1 e7 b) i  F  {- v3 O  f( V' Q- [+ n
       int[] cnt = new int[26];( E3 }9 p7 `' K/ v
       for (char c : s.toCharArray()) {7 a, u2 I7 Q  y" t! x7 t
           cnt[c - 'a']++;
' v" x7 g7 U1 i) g5 i; Q      }
9 x6 A7 E# t% y6 K8 k! J  I; z0 h: e, W3 V
       StringBuilder sb = new StringBuilder();
1 K% |8 s5 z) ]; J* P       int repeat = 0;
& z5 G0 \2 h( }9 ^$ V& F2 a! @       char cur = 0;7 `. }4 L& m4 e! N# ]
       for (int i = 0; i < s.length(); i++) {
0 R& E/ U2 U" t0 a8 \           char c;. s; k+ ^  L7 L/ Q! j  g! j
           if (repeat == repeatLimit) {$ r4 C8 Y1 ^) [. ?. N% Q% I
               repeat = 1;
6 V6 R0 j0 s% R& V+ Q2 v- o               c = poll(cnt, cur);+ G( _0 e0 p- b8 d. }
               cur = c;# B. R  }: j+ t4 q
          } else {7 l  Q( c* o6 C, [" @+ q
               c = poll(cnt, (char) 0);
+ L" W2 Y# d4 |# q# u# f# C. x               if (c == cur) {3 G1 n: Y5 n5 ~: R0 y. G3 h
                   repeat++;' i. R6 @+ |8 t7 v) w" p+ |7 [
              } else {
; ]8 l# k, {: n( @6 Y; S( d5 M+ @                   repeat = 1;
) f$ k, Q/ |% r! j. k                   cur = c;8 o- o' H7 L6 t# j, u6 A
              }8 P  D, W$ ]6 ]# p! @  X
          }3 H5 O9 r2 P( {0 ~! R
           if (c == 0) {! A" s1 \4 s7 `- b0 W. K
               break;
4 F, Y) d- b. u9 g! k9 `' E( o" g          }
% e3 F1 z; n% |1 K, T           sb.append(c);, V& d1 v" Z, H6 {9 r; q
      }
: H: l+ A9 L9 q4 L       return sb.toString();" }# _4 s' m5 `; a. c$ o
  }( U- q6 A) F7 z. c

( p/ d! ]& J. W6 s# E" ~   private char poll(int[] cnt, char not) {
) p( W( c: ]7 W/ n5 X       for (int i = 25; i >= 0; i--) {) R8 c4 I" ?) S
           if (cnt[i] > 0 && not != (char) (i + 'a')) {+ P1 R6 H* W/ e" U- d
               cnt[i]--;
5 Z, m6 B0 d$ [! [* S               return (char) (i + 'a');
( b! Q# i( O3 ]7 T. k& Z          }
% i- U" q7 _+ J      }" L! a; L3 `2 ?4 Q* |; v
       return 0;
9 t% K2 `( d. _: j5 p- ]  }
9 ~0 _' M) j) F" ]8 m}
% s1 _$ E. a" Q$ w4 u' E+ l; f) l, q3 [
0 w" W7 R0 R' r5 E/ i+ f6 Z6 M/ y
; c8 l' [; t( t6 u【 NO.4 Count Array Pairs Divisible by K】' D/ ]6 E9 c. `' x4 k) D
3 q: V% i) G$ j: a
解题思路5 h0 B) ]  o" M4 C
预处理转换成最大公因数,详见注释。
8 n1 F3 h& w/ G  \, {! ]
4 d( `( \3 T9 A8 }代码展示
( u1 `5 Q. d2 m, O0 `  P" _! R$ U, R
class Solution {" F* v$ l8 x* C9 S8 u
   public long coutPairs(int[] nums, int k) {
. ^9 H  T; w$ C7 H3 q& ~       // 将 nums 转换成与 k 的最大公约数
9 I, S) b* n8 ~       // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)' a1 S) z  O& H) P1 V- S) c
       for (int i = 0; i < nums.length; i++) {
3 L3 z, V! J1 Z7 R0 d7 H: {           nums[i] = gcd(nums[i], k);" D8 l1 f  a, G9 `/ y* A, h9 H
      }
( ]! c+ b; ~( K8 E$ P8 q       long res = 0;
" o" u" S( K5 ~- @$ b8 i       int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数1 k  y$ @& Z8 u% n
       for (int num : nums) {
. n5 Z1 z. h0 T# {" L- X           // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数/ m* Y1 L, h4 \& V  f- Z
           res += cnt[k / num];: ^% n% n" S* d; o) B' f) c' o" `

. z$ x+ ^& @) P2 J" M* C) i3 U! F) D           // 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++
6 G8 U$ x3 d! i; Y2 Z           for (int j = 1; j * j <= num; j++) {
5 o7 C1 \5 q/ a7 m1 v               if (num % j == 0) {
3 m/ H; K3 l8 W$ {                   cnt[j]++;
5 e/ V6 H" _0 f0 k5 B                   if (j * j != num) {; ^! p. ]; J+ F& A1 i5 U
                       cnt[num / j]++;+ Y3 N. _- c9 p6 B% y
                  }* P( {. Z. k$ G
              }
" [/ j, I4 y9 d* p' D. r% u( k          }
; ?9 t/ d0 _) F- n* f# b      }
$ |& T7 m: e/ k: @/ _2 a: i" }       return res;8 S& k) h. v9 x$ R6 z2 b
  }6 E" M7 \2 e0 k1 h! V
- K& C/ |: N! b
   int gcd(int a, int b) {+ s, k' k. ~. k( {! y# L6 ]
       return a % b == 0 ? b : gcd(b, a % b);4 [- ]* r6 x* i9 a
  }
$ a; S# L  _$ G$ r+ _}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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