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