登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
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} |