登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 Count Integers With Even Digit Sum】! z) b; B8 y; P w/ X
( o1 z0 N, y/ C% n
解题思路
. S6 a7 O+ K( i( V4 A签到题,枚举计算即可。
( F6 K6 k* d8 L0 }2 H& u
2 h3 |! \( ]5 a, H! |/ Z$ T; H9 V代码展示
- p9 V w/ c$ r; N+ K: Y% f. B0 W( V+ W1 a7 j! u
class Solution {* l" k5 g. f# h' g9 c
public int countEven(int num) {
, `. {% |+ }6 L0 G) T int res = 0;
) a1 t2 O, V& N. l for (int i = 1; i <= num; i++) {5 N! w4 m3 x; b1 l
if (digitsSum(i) % 2 == 0) {$ \5 k* X7 H; [5 ]& p
res++;
) y8 b8 b3 y8 o+ X( j. i7 j. O }4 Q% V; c9 V/ L# s% C+ G
}5 v. b7 q5 c& r7 v) g5 u% ?( ~4 O
return res;1 [5 J( g: E6 X. H2 A8 @7 e; ^+ d5 I1 R
}4 O- r2 l7 c9 |' q6 C4 ^( N. a/ B% T
- r" ~6 N/ z* D0 q private int digitsSum(int num) {8 X: _/ b p3 | r% T
int res = 0;6 f6 _/ |8 m% L5 P; L
for (; num > 0; num /= 10) {: \2 E' h$ A4 p
res += num % 10;
1 k3 z5 h6 h4 U3 s: H7 _4 ^) j2 ?! Q }
+ C$ I Q7 {6 a return res;
+ E5 P7 V, w/ V9 A* X! {# ^ T }
9 u8 w. i! a- K9 K# n8 K+ y3 l}
7 s9 K) G7 v- A5 Q9 P0 j+ B& L; d
* w, h2 J* Q2 G【 NO.2 Merge Nodes in Between Zeros】
+ N I: s: Q% [: L/ H; Q' c( C
' M3 C- I( z5 {$ b# E. J0 e9 h解题思路
/ Q0 n9 V' F$ ]2 z遍历链表即可。
3 I4 E" K7 w" ?- V- t+ }: R$ S5 \( o6 `% ~+ }! L' d
代码展示
# U; b+ x! O: T( l6 ]5 Z
, K& h- T5 x9 E$ h M1 v3 nclass Solution {
" F8 }3 N9 ~8 [; `/ U1 t! \ public ListNode mergeNodes(ListNode head) {
: E" ]$ U' H+ k) ~ ListNode res = new ListNode(0);. O) K$ G% H" |( p- @
ListNode tail = res;
! {1 G. A0 U/ B: ^$ F int sum = 0;* E. r9 ]& N% N( G* U
for (ListNode cur = head.next; cur != null; cur = cur.next) {
! [( D: R: ~' D6 u9 A sum += cur.val;, ]9 h, m" t4 O$ m
if (cur.val == 0) {
& z7 v6 Y- s o# M" X$ m7 G4 W; C tail.next = new ListNode(sum);) Y; q' `8 M! H
tail = tail.next;3 t- p6 m) ?8 @* b7 V
sum = 0;6 b, |+ s0 _$ w6 w [! J& ` e
}, w0 [" W M7 o: H" }
}
% w5 E7 e) {3 t1 b, E/ U2 I return res.next;
1 {6 P3 H2 b6 O' o& c. } } v$ f' p. j0 j$ G; R3 Z! k
}/ v7 ~5 j& _' c$ v7 i
4 F$ W- F& M4 u# z. l1 J
3 c. Y. f+ C- }( C& V【 NO.3 Merge Nodes in Between Zeros】6 r; `: Q# l+ s+ U
, r% L8 @: d2 A5 Y/ H0 p解题思路9 O# g' W) y2 ]5 v0 f
注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。" P u6 Y: j8 h f0 o# s1 k
- C l3 S( @7 C" G) P+ @
代码展示: v. k# ~# @% p! n& f Z; U5 ^
& O) m" W: W6 t8 v# D J" K5 N' l
class Solution {
6 h; N5 Z2 m$ {6 T$ H public String repeatLimitedString(String s, int repeatLimit) {: H/ \% N; y$ U& b( U% t( ^
int[] cnt = new int[26];9 U( A; o5 X2 Q: A" m; g
for (char c : s.toCharArray()) {3 e: p& c) ?5 k
cnt[c - 'a']++;
* y8 E5 |# @- @& i) ?- H }
$ L" J. T; p& |' g1 o0 }; W3 m }
! d) N2 ~. I% ^ StringBuilder sb = new StringBuilder();
- W" V& Z5 @" i: \0 x3 b" K( [ int repeat = 0;% s9 A4 p6 T" g7 Z) E/ B
char cur = 0;
3 c4 t, b- \; F- g o for (int i = 0; i < s.length(); i++) {
. f" `2 |/ ]: {& V9 z5 v# C0 Z7 }1 j char c;
7 j, a& H" i! L# v @$ V1 s$ C r if (repeat == repeatLimit) {9 O7 l$ |: G% j" g6 N$ R h4 O
repeat = 1;
2 D9 g& k! h6 Y7 K' }! `9 Y c = poll(cnt, cur);. c$ ]0 J1 L& {% |% V# l( D
cur = c;! i+ m% p% p8 |5 ^4 ^9 [7 B" K4 t
} else {
9 U: \4 r. v5 i' g' I' y5 q c = poll(cnt, (char) 0);
8 Z1 x+ S/ G, Z& D# l if (c == cur) {
$ x. F5 j6 R+ T1 U8 }, R; ~ repeat++; l5 y$ t2 H5 K4 w. T
} else {5 W/ {8 Y' V$ @
repeat = 1;& }" S; g6 r j1 y) {2 m1 a
cur = c;3 |6 L: i6 b8 f
}& k& Q: n" A( h s
}
/ j. R; ?# l" e if (c == 0) {
! n& c( w" I8 `9 p8 d break;- d0 q9 F5 R+ O7 Y5 i. R% m* b
}
3 e8 h$ f }0 M) }( A- @# N5 j sb.append(c);
9 n" O h7 F5 @ }
" t4 h" l% m& c/ E return sb.toString();
, q& V J9 t0 u: W. v( e7 ]+ r }
8 t) ?4 S' e: M/ c, K
8 F' V! e* s" n R0 q7 d private char poll(int[] cnt, char not) {
4 s: t! i9 {$ |/ @' } for (int i = 25; i >= 0; i--) {2 Z, ~- \' d6 K* R9 k! }4 b: r1 Y+ f
if (cnt[i] > 0 && not != (char) (i + 'a')) {+ l! [: M9 a) [+ }
cnt[i]--;
, } @# y0 [2 a1 Z6 C3 ` return (char) (i + 'a');4 G0 }- B6 g6 _; M& K) l. m
}( C/ t" u$ [7 i% l4 r, V: L I8 S
}1 _3 Z- O% z1 W: r" O5 A* m. a
return 0;* t, ]4 v w4 v' }5 \) N0 Q
}
% d+ l: r) i C0 D: C( ]# i& O}2 g1 `+ A2 e, u& `1 \5 k
" ^ q: p3 l* N- d4 g5 x
" a0 Y; A+ I4 U l4 @/ B4 J
【 NO.4 Count Array Pairs Divisible by K】5 \9 M& W2 q8 E" \" {/ n; y+ b
) f5 Y/ I4 s" V# \0 g3 p% \ L- \解题思路
; k8 B5 t( f4 R/ Y/ ~预处理转换成最大公因数,详见注释。' M4 V7 e5 L K
. }; x3 Z/ F3 g; @
代码展示2 f4 L2 V+ D6 U) L2 b- E: s
, ~& c5 q* y: A% M) d
class Solution {' c# Y2 j5 f4 L5 z
public long coutPairs(int[] nums, int k) {+ f# V# M; ~) T) @& m; b5 ]+ X
// 将 nums 转换成与 k 的最大公约数
: K' O2 i3 c, f4 ~( O // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)5 T% h; K m( l" a" H0 T; r2 U
for (int i = 0; i < nums.length; i++) {) K) ~5 N) Z1 ?7 {3 r; }6 f" t
nums[i] = gcd(nums[i], k);; f/ f0 I* H8 N5 y' Y- H4 e0 {
}
1 q: `, M8 `' ]; |) W% k long res = 0;
, N$ T9 |: v2 ]7 X5 e v/ ` int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数; [! G6 O- r7 J# P2 l# G
for (int num : nums) {# J9 S; Z8 p- b0 i0 `
// 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数
, Q4 v a1 ^4 [/ @( e% m% y+ M7 z- o res += cnt[k / num];
' ?! H+ L* K* c A! f( t4 `2 j* h* H# Y8 F$ }
// 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++
. u3 P" [+ L7 E! Q2 t) ]9 r7 K2 h for (int j = 1; j * j <= num; j++) {; ~5 h- v3 o4 E: Z* N" y$ e
if (num % j == 0) {
8 i, Q& L- e2 l+ } cnt[j]++;% O" K% H |/ X2 p9 N
if (j * j != num) {
) ]% c7 l' k8 A& E8 ] cnt[num / j]++;: q n% g& r+ O9 D" V2 c) L+ H7 T
}
# p1 m& ] j- G% J8 Q5 }) ] }
$ A) L6 s9 U: G4 m; f6 _0 j, _ }) M# X8 z9 q. L/ P
} p% @( U8 }6 j& m! U% w( X- Z
return res; }: M1 b& X+ P7 N& |" Q' o
}
: a+ ]3 ~3 L3 X; p: g. q# ^# W; N# j
int gcd(int a, int b) {, w9 i3 `& ^3 W; {7 h
return a % b == 0 ? b : gcd(b, a % b);
5 ~& T& r+ ]1 b }9 n1 o6 \6 J. D. ~2 d9 O- i
} |