登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 Count Integers With Even Digit Sum】
7 O4 G! r# S3 t+ E4 h. } ~
2 ^. v; X2 ^ K1 ~* m f解题思路0 V) M9 W7 ^1 M
签到题,枚举计算即可。% S5 F+ l1 a2 p7 r2 x) P
' ^. _- ?5 B5 k0 b. Z
代码展示3 U$ M) |% L6 W" S! f
* H& @8 ]4 D" e0 G4 I; K/ J8 G
class Solution {- d# y% N/ B- c- h* @) ?
public int countEven(int num) {
- y' ^7 Z9 Q. N' c( B) R int res = 0;2 F/ K9 L- S: y5 I5 R) S7 ^& y& m
for (int i = 1; i <= num; i++) {# K' c- W' c$ _: y7 X; T
if (digitsSum(i) % 2 == 0) {
2 f4 t- O! G- F res++;
& W) A( c$ @7 B; [) T. ]3 Z e }* Y; G: H4 ~* [, O3 y! S8 n
}
4 R% j* i3 c. @$ z" p, c& Q7 ` return res;
2 Y$ ^9 A* x b+ k* U+ M }2 b% l& r0 m* h. U. ]' `
- S' @+ m/ p1 |$ F0 s private int digitsSum(int num) {
9 r' O* L; R) m( _9 X! C% _! }) n int res = 0;- X) i( e; H& V5 R1 ^
for (; num > 0; num /= 10) {
5 Y3 L2 W+ h9 X! m. n res += num % 10;
: s+ n1 P7 f( B9 I }
. {" X0 h9 a# ?" _2 J$ |/ f- F return res;2 x T) U8 x/ W* z; t, B
}+ r. W3 L' g: A; }; m7 R, x
}2 N, O2 O @3 S( [( \# i
) s! V1 a, [ J* x) H7 ]- y* e! j3 u
@- b* D& ~1 u# C7 q& {【 NO.2 Merge Nodes in Between Zeros】
) Y5 C! \5 H/ M+ Z* g3 _! I$ |+ \& V) ~/ Q6 F' _9 @; l! c
解题思路
" S3 X7 L `, `* S h( x遍历链表即可。2 `; b9 E& J) @* m. s8 p: i
" V0 g+ a9 F3 Z5 J代码展示 ?2 l' X. a; R+ L- U# h/ Q
. o0 S: L' M' G0 K- N0 C6 I
class Solution {
& z& {8 r4 L' o0 n4 G3 C+ m% G public ListNode mergeNodes(ListNode head) {
" K3 ?- i+ q5 U. }4 C ListNode res = new ListNode(0);! {% I& o3 o T8 S# }" v
ListNode tail = res;
% D e9 ?: v" h+ h! w0 c, e" S int sum = 0;: T0 v8 Z$ \2 ^6 ?6 E
for (ListNode cur = head.next; cur != null; cur = cur.next) {4 V2 l( b7 `9 ^0 }
sum += cur.val;: P5 ^9 }' P5 N; O
if (cur.val == 0) {
! x5 E( k2 L/ R/ K3 i7 n- O7 p tail.next = new ListNode(sum);
' G+ P* `) M" s( o+ }7 y ^8 F" r tail = tail.next;1 l1 g. F" q/ U( h
sum = 0;
3 p" C! h7 N0 |/ l/ x: s- ]! C6 @& ^ }
8 O3 n" f/ }5 w) U( p, V1 W }
) E& F$ v4 R* e4 T% b* h8 G return res.next;4 L. E8 V7 _) q& w! t; G" z
}
( S5 |. I9 o, U! V z}
W M6 g4 T, P( g6 d8 T4 x) o; a d1 Y0 N, Q, p2 U h4 \
4 L$ z! K0 S1 `1 O0 A
【 NO.3 Merge Nodes in Between Zeros】, R! P, ]& G9 e2 q2 E3 U" f
( B3 W3 y( ?1 m4 J' Z解题思路5 `# |5 F) W g2 p: k% l! y0 d' t t
注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。 S: n3 W2 D9 ?7 S; v) I0 V
5 ?7 N& w) Y2 ~- f7 j: F8 ^, z$ S5 l代码展示. k! I4 A% O: Y
) p: ^0 ]! J( l% z' Tclass Solution {" b& n( [5 I6 m6 a' n
public String repeatLimitedString(String s, int repeatLimit) {3 k: Z- L0 S9 Z# a
int[] cnt = new int[26];
6 j9 K6 _! U% b for (char c : s.toCharArray()) {
" ~% O0 U+ d2 r, k2 W cnt[c - 'a']++;
' ~5 H, a- Q- \; @ }
3 D1 {. R: q8 s( X0 {+ w. k) B+ @+ _( Y( B" r' r# D2 A
StringBuilder sb = new StringBuilder();
4 `$ l v4 F9 ~: N! t int repeat = 0;
* [0 H( q) E$ _% o0 x. V$ ` char cur = 0;8 i2 ]6 H# p* p4 T9 B, H
for (int i = 0; i < s.length(); i++) {
1 A6 I7 k- @" t, N char c;% g/ C- l1 @- Z# }4 q) s
if (repeat == repeatLimit) {
3 E# A9 {2 {4 F& L6 X repeat = 1;$ \7 _' r! o Y1 @
c = poll(cnt, cur);
6 [$ |8 L0 K; C3 F# H! R g2 P! @ cur = c;
5 N# J7 C& a. D2 P } else {
# {$ {4 x( H. o2 ]" Z: Q( K; `4 O c = poll(cnt, (char) 0);, s5 @) @+ c* h8 J
if (c == cur) {
5 `- N, s' x* } repeat++;! z9 @' y: j2 C: t
} else {
- n! t4 {, a, q1 p7 D repeat = 1;
$ G v% \& M/ M8 f; { cur = c;! `0 [' \6 X/ [' [# g
}2 G3 y# t6 y5 l% y0 p0 W) D
}6 `8 ]8 H8 D6 C/ O' M
if (c == 0) {
( \2 H) h+ X5 W/ m) j l' o$ r break;# }* N) R* H0 J' e
}$ g4 }! O- }, \: Z
sb.append(c);
' h- J) a4 H+ p0 ~: s+ f }
1 f7 X9 Q6 j% {3 S' Y. {' h# | return sb.toString();
8 T5 D! Z4 i" E6 C }, W' [& u2 S6 G3 h+ |) |
) N* m# |) g! |" F# B0 N# G- K
private char poll(int[] cnt, char not) {" c# w, V: b3 ~. g2 Y: _
for (int i = 25; i >= 0; i--) {
% Z$ M/ x6 V# S: ^+ o. E) [ if (cnt[i] > 0 && not != (char) (i + 'a')) {
/ ~+ n( V. |* R# N' V cnt[i]--;
4 K, A/ k/ ]- D+ _5 G8 e2 i4 A return (char) (i + 'a');
w0 ~/ t) q4 v5 @- f }$ o o, w6 h# ?9 m; h
}+ T5 W. H/ ~7 [' q
return 0;
3 H- C! r$ O2 r# U' k/ K3 H }
l J8 ^1 R# |: x' O}3 e7 d; T Y8 _$ z& S, Y3 Q
0 Z9 x" v( [. i; K1 V1 I; w( h
8 _; O! g4 I! f8 {0 s! W【 NO.4 Count Array Pairs Divisible by K】. P# A2 H4 {# ~& x3 S
3 m! N2 I5 R- A# J* A/ @解题思路
3 J3 l* N- i4 r8 g, O0 l预处理转换成最大公因数,详见注释。
6 `4 \" C3 y0 N' a
+ V# M: k) h+ q7 j, L" h6 |代码展示
, N1 D/ u7 D9 w2 W8 ~% k" X2 Q
2 @. B; U% P* X, Pclass Solution {
3 u8 r. C8 h; U5 I public long coutPairs(int[] nums, int k) {3 \2 w4 P* ^6 K6 u
// 将 nums 转换成与 k 的最大公约数
) x) u b! L, l5 ^0 ^ // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)3 x. }4 ^2 {7 R' ?/ I+ n
for (int i = 0; i < nums.length; i++) {
" N5 R/ O \$ i& a' d4 I( s$ ~3 _ nums[i] = gcd(nums[i], k);: \ k# V) L" C/ ^- g
}9 }& L( J/ f v3 ~, f' [6 q! q# \
long res = 0;# O6 i- t) E8 u/ J9 i
int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数: b7 M4 h' \( S" V* K" R
for (int num : nums) {
- R, _, d, `! I* y, f D // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数
! Z! i( N; k7 P res += cnt[k / num];
; W# Z5 x J) m& ]# w
9 t$ ^; k* O$ n& v# o // 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++
. f6 m b: u6 V0 o. m% y; |7 q' t6 i for (int j = 1; j * j <= num; j++) {+ v* p/ t. z( K* p, ?& ]0 U o1 V
if (num % j == 0) {
C( v; f* `) S, p cnt[j]++;; w( X9 {% J: o/ G/ G
if (j * j != num) {
/ X3 ~) ]2 d' p8 a* @ cnt[num / j]++;
+ V& E! p4 I8 `7 ~ J: e2 s }
' B' A9 ~' b3 r3 {2 Y3 ]% B. L' G }
1 l2 ?+ l( | ?) t( r2 W- C1 p }
}( b; \8 E+ F7 w9 z }9 C5 v @( z ^# W
return res;( o! Q. S6 e8 T- }8 u$ h
}
6 b4 i5 w1 H4 l( D1 n: h! {
0 C5 u) y7 w) m+ B L int gcd(int a, int b) {. g( w" J+ X- \7 C6 s, {! }7 D
return a % b == 0 ? b : gcd(b, a % b);3 h0 e, R4 ?" c b/ t& u: C
}
7 D, C# z! h: u3 u% X} |