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