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

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

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

UWCSSA提醒您:

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

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

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

登录后可回复主题

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

x
【 NO.1 Count Integers With Even Digit Sum】1 h+ V3 E+ c! q" ~- s0 Q
7 [! `% H( ~% O) C/ _
解题思路8 z1 o/ m9 Y; f& ?* ~9 R4 P0 y4 z
签到题,枚举计算即可。
; B- }! z, l0 Q4 J" k
% R& N; Q: t; D- r  L0 f# T3 p代码展示4 `& ^( a5 T# k8 h( e$ P4 G
# j; `. R# d2 ?3 d* U5 h
class Solution {$ s7 j. @* |) V% @, S
   public int countEven(int num) {
3 V! p5 P5 ?( ^2 |3 [  [3 L       int res = 0;& G: l/ [) [2 N
       for (int i = 1; i <= num; i++) {+ A! Z4 J! v& h8 h
           if (digitsSum(i) % 2 == 0) {9 S, X" f# g0 E9 d- l5 R
               res++;) A. c& Q" W' r- n5 X" t
          }
! Q' o6 @. f* b9 b1 ]6 g      }
# @9 Z' ^+ v- L3 Q5 `; C       return res;
+ P! l2 H. n# |: B- T3 Q# u7 u  }: Z; o8 }# Y/ f" Z  M

6 X" Z: O0 `: \0 s9 S   private int digitsSum(int num) {
( `7 \  y# Y2 {8 Y" T; S2 Q; A/ I       int res = 0;9 T$ x0 o4 b/ s1 w
       for (; num > 0; num /= 10) {# e# C+ }' P; ?- m  d, N
           res += num % 10;0 _6 U: Q! D7 }) J* R$ Y' `
      }3 G' K5 r7 V% v2 `
       return res;0 v; `  n) e- Q1 {% g
  }6 T/ n8 h4 Q- E* W3 `$ x, L1 D
}
+ r+ I2 u* O$ y- M2 O1 A6 h2 m2 \5 X* w# h+ m
, B% H! ]1 F6 b  _, P/ J: b% Y
【 NO.2 Merge Nodes in Between Zeros】
* O. w' c8 M9 l
6 K8 B5 r1 v$ d; t# @' w! r解题思路
, k8 m7 J, i5 \/ I遍历链表即可。; t0 m+ h7 Y6 m9 J
2 q; s0 E, p6 ]( J0 q+ ^1 K/ X) v
代码展示
0 }5 L. L+ T6 G8 G
6 g/ T  q/ N" rclass Solution {: E6 u/ D" t; K5 X
   public ListNode mergeNodes(ListNode head) {* l* t$ \! m) S3 \5 }9 k% K$ ]
       ListNode res = new ListNode(0);/ }. K0 |& R2 ?$ |6 v. L8 T
       ListNode tail = res;
; X3 S; \2 |; Y/ m       int sum = 0;
. w/ ]8 B) C9 u1 y$ F. w       for (ListNode cur = head.next; cur != null; cur = cur.next) {9 \3 s; j1 J3 ^( {8 Y# ]
           sum += cur.val;
  `) j! Z: l; V3 [7 _0 T           if (cur.val == 0) {
8 `6 `) J' v& _- Y. q4 k( x/ a9 x               tail.next = new ListNode(sum);3 m$ r. x7 W4 f* ~+ F  d1 E
               tail = tail.next;/ U) x2 L+ I# P, d1 D
               sum = 0;) t9 U- [/ l! r8 V2 x' g  K1 m  e3 Q
          }4 w! a$ M( n) [& H
      }
4 B: i) E4 y$ j& r# {( `* ]$ {9 i3 r       return res.next;7 ^0 N5 G8 m( \  x; t
  }/ U7 B; Q" p& }
}9 F) b% T' J! d/ ~% q. I2 P" n& Q
  W, g. q2 H6 v3 s

8 E9 O. F+ e1 Q4 N7 |6 T【 NO.3 Merge Nodes in Between Zeros】/ t7 _( i! A  M  v
. ?; e" ~# j  G2 X0 \
解题思路5 q' j% x. `$ z3 |
注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。6 @% g: T( ?% T" q0 G: _

4 c! a  `& l0 {6 b( |. x代码展示0 A. A9 }, p  r
0 A1 [' |- X" `
class Solution {
! [! [( D3 p# m* X, n- \   public String repeatLimitedString(String s, int repeatLimit) {) {/ v4 F& a. q
       int[] cnt = new int[26];
: r/ Q. |$ [' |6 J" H/ U! o) d4 Y! Y       for (char c : s.toCharArray()) {
9 {4 j- f+ @) D8 j           cnt[c - 'a']++;
8 ~/ }* K. }: i  Q* u; K- I' x! p. s      }5 q; i0 m  V  L* N$ h

/ Z, v7 D5 c" D- \$ x5 j       StringBuilder sb = new StringBuilder();" o2 M. I4 u' j" j
       int repeat = 0;
7 }$ r/ `( g* n/ m" M       char cur = 0;
) T' l- A" N9 t, T       for (int i = 0; i < s.length(); i++) {
* o+ M3 `* r2 m+ }& x2 |6 Z           char c;
/ `2 _$ L4 b/ n0 z) R  \           if (repeat == repeatLimit) {
8 r1 i) a' N4 R3 w8 {$ {2 H/ o: _               repeat = 1;
* ^# C6 n- a( ]               c = poll(cnt, cur);  D3 J0 C# W+ _9 l) w( U
               cur = c;4 A8 P( J# N& e9 m/ G7 W
          } else {
7 C; ~1 d8 C2 F1 R1 ^. Y; B# z1 ^5 V               c = poll(cnt, (char) 0);
2 \; Q/ z" A& j+ i7 b* Q               if (c == cur) {
8 @$ t, ]2 `6 d' S$ ~% H6 C                   repeat++;
( J$ n. c5 Y/ k5 D              } else {, K( v2 N% i: A! V) _  a' O4 X
                   repeat = 1;
+ ^4 `- f" i- i9 \0 {, M                   cur = c;( Y4 J7 }) L, U3 y
              }
* T, ^; \( H4 I' e( @2 ?          }
7 [, `& s4 Z5 i           if (c == 0) {
* I8 y! [  r; ?  I               break;! s7 O, I) R! C, C! o# {
          }: o' X! c0 t3 a9 f
           sb.append(c);
8 R. x9 F) Q% C3 Q/ [      }( f. _! u  `7 ^: d
       return sb.toString();
7 T8 }2 a, o8 C, E: h& T- E6 L  }6 K3 \6 P: V. C7 ^

. s8 ~+ T: A0 H# f" e   private char poll(int[] cnt, char not) {
5 v/ j) r' n2 b. l- K       for (int i = 25; i >= 0; i--) {+ ^, V! s9 C9 v" ]9 y; n
           if (cnt[i] > 0 && not != (char) (i + 'a')) {
' F* Y; V; m  F% b* I; N               cnt[i]--;  n6 o' W. M& i; M
               return (char) (i + 'a');
4 R' \/ d" B4 |8 M0 G; |  ~9 _          }* Q( P1 }/ N5 X: {/ Y8 L, K/ X
      }
! Z1 ?- o  _2 V& D       return 0;
+ T& i3 C$ ?' {0 \+ `7 @  }
% _9 G6 t; A* `' g& S6 g7 A}
7 w/ I" S* E8 W) S- N: i
& K: @) N4 u/ z3 e$ ], L9 H* a0 n$ x
; o( A- j! `. q  E5 c【 NO.4 Count Array Pairs Divisible by K】
- K4 z  V5 d0 Q' F& {/ r. m& c  M% N! _- k8 a
解题思路# j3 L/ u" v* X
预处理转换成最大公因数,详见注释。
  v1 S' d$ J) e$ g4 p/ a
. d( [/ z6 G1 h5 u代码展示" a( V! z& G1 }

: g6 `) I3 ^0 a9 a* I" pclass Solution {# k' Q3 }8 \6 g5 b- X" O2 S
   public long coutPairs(int[] nums, int k) {
+ j6 ^+ z0 }0 o" U" z: H       // 将 nums 转换成与 k 的最大公约数- s' \9 {4 r, F8 F
       // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)0 H+ e) q+ O/ c  L6 n! `( V8 J
       for (int i = 0; i < nums.length; i++) {
7 `2 Q8 ~6 n( l, Y  L           nums[i] = gcd(nums[i], k);
; r/ K8 w9 p* B" l. p      }0 A) z+ |+ [: L% H0 y8 Q
       long res = 0;
; y# t' I$ f# p1 _. D       int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数
& j9 W# p) e. b  a9 y7 h  v       for (int num : nums) {
5 o6 j, n2 w  s           // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数
% t& \: i' @! M8 _- p) n% c6 c+ M           res += cnt[k / num];, Z2 N4 J6 ?: f$ C7 {# h! }
0 I! V1 q0 t8 a  F- v! L5 i
           // 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++
$ z' T  A/ r7 u) V+ D1 ^           for (int j = 1; j * j <= num; j++) {
5 [7 ], s3 x3 Q1 ]. r               if (num % j == 0) {1 _" t6 }/ ~) m) e% b
                   cnt[j]++;
5 ?( l: }% F9 l# L  Q  [                   if (j * j != num) {5 n+ y+ \" H; @+ b  v3 D' ^8 b
                       cnt[num / j]++;7 b- s& D3 s0 n5 F9 J. F- ]& i
                  }
- K/ P$ `; |& u- v9 k              }
; N. c5 W! A: _( F" _  p7 S# C          }5 t5 \/ k1 b4 v. P
      }1 @5 h+ O5 ?/ \% y
       return res;
6 k" P- l8 l9 v5 c/ Y" T! i$ u8 R; S  }
1 I8 N3 v! |' L7 H& X  G  H+ q0 S. e- ~( E% `- k, ~& k
   int gcd(int a, int b) {3 _7 J0 d3 v1 d6 Q5 W$ D: @
       return a % b == 0 ? b : gcd(b, a % b);# g. _- I  G/ P2 U3 z3 E9 o% b2 S* |% b
  }+ K* E2 [% l: U: D
}
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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