登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 Count Integers With Even Digit Sum】
; t* }8 G4 r6 T7 d
5 g3 h% V1 ?2 r/ W+ c6 h% Q解题思路
+ v' F! } ^$ ~' p) J1 w& r- F签到题,枚举计算即可。
7 b0 R6 \) N9 z" B/ G8 W& _3 K7 N
代码展示2 d( t7 O6 J) T7 Q
3 ?- ?; U; N7 M0 i6 M! d' o7 v
class Solution {1 l3 y+ k5 L- F Z9 o6 w. _- ?8 ^
public int countEven(int num) {
- x# A, L/ a" k0 l9 h7 [ int res = 0;
( h; Z' x/ m& J$ v, p: k for (int i = 1; i <= num; i++) {7 }7 V/ `: j2 r9 e
if (digitsSum(i) % 2 == 0) {
7 e. q" e3 a5 _3 x' r; y res++;
8 y4 @# R1 U* [ }4 m9 c; ]5 H& { U
}
( t$ J! f- H+ Q$ e- u5 \5 [ return res;* s$ q1 L' M3 j& p7 e$ h
}
9 ]7 d2 F$ E& ]* x# u/ h9 ^* U4 E
private int digitsSum(int num) {
3 \' d7 H! e# J5 v8 s$ w int res = 0;
. e# Y4 U* k* W6 F1 A for (; num > 0; num /= 10) {
, U, P0 K7 N5 E( c& x! h res += num % 10;
* a; e G0 u" B* x4 X' ? }: d* \# m: a( S
return res;
T7 j% T- }. _ }+ H/ {' g6 ]0 R$ w4 `! D+ ^; d* h
}
# J0 Q) m, c2 G" U; e0 n6 _# d A
. Y5 e9 H" d0 v1 l
【 NO.2 Merge Nodes in Between Zeros】
- P% {( ]8 j7 a. m# h$ I
0 o$ @( q, Z6 X5 l$ u8 _$ ~$ ]* x" W解题思路! ]' U2 E$ z. s# S5 h* `4 B
遍历链表即可。
& y( l9 P% ]& v) p: k4 o# [+ I+ a9 O7 O" [! N2 H) S( q0 r; O
代码展示2 q' l5 Q, A8 u2 S
2 f9 Q2 U4 Y f; n0 N- b
class Solution {9 a9 u0 A2 b! c+ J' b0 J. T. k
public ListNode mergeNodes(ListNode head) {
) t" q2 G( ^2 G2 F- ~8 o ListNode res = new ListNode(0);
7 I$ T5 ?3 b1 f/ S6 Q ListNode tail = res;
0 i6 L5 K: `+ K* t int sum = 0;" w* M* t* ^4 N# U' c- P' R6 ~" ]
for (ListNode cur = head.next; cur != null; cur = cur.next) {2 E3 B$ n4 Z5 L
sum += cur.val;, e! V1 h _4 c M( R/ A
if (cur.val == 0) {
6 m! B# L+ k0 z tail.next = new ListNode(sum);
% U( ?$ l1 S, \2 O' d" { tail = tail.next;0 a' ~0 t0 J" K- w6 q' [4 X
sum = 0;( H/ A% z5 ~9 X
}* B! ^6 ~" B( Q1 t; u
}
! `+ P; ?2 o- a# z. d return res.next;
$ r" a$ Z8 N2 O; Q' m }
8 h$ _- C$ V7 E2 x1 n/ h}& c7 G3 i. [; A0 u# ?! y9 Y7 m
0 u4 E. W5 n' z* W
& _" o3 G& L" S0 l' z
【 NO.3 Merge Nodes in Between Zeros】
" h% N. q" P; [9 r, ^1 T3 |2 ]2 m' R- Q( G$ p7 D( E1 m2 k: x8 L
解题思路
9 `: S8 Z( x& \2 D3 T5 C$ e& \1 t/ [注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。+ C# [- q6 l( m2 U2 u
! v! K O8 d. X- \) W5 Z代码展示& d9 F" ]7 V, U5 z/ k
]* k4 D" b0 ?4 x3 v" t. K
class Solution {
, u& D8 c" x% z) v+ h0 b+ P0 Z8 n public String repeatLimitedString(String s, int repeatLimit) {4 x% ]' ]* x* w
int[] cnt = new int[26];
. A* X, `+ ?! S7 F+ O0 Q for (char c : s.toCharArray()) {1 t8 w N( M. k$ w
cnt[c - 'a']++;
7 O, d u8 m% Y$ r3 v2 | }# T8 c+ p5 V; x7 H2 ~. r
% J; F+ N8 w2 R- ? s1 l# | StringBuilder sb = new StringBuilder();
* J% q/ M; k- K/ @- f5 J. V int repeat = 0;
9 B. e. J9 x3 z4 c4 ?; m char cur = 0;! |( I6 { m" @2 x4 ]
for (int i = 0; i < s.length(); i++) {# Q% t4 P+ Y4 A W; w
char c;9 T& g9 L9 Y. m' d% U( B. B
if (repeat == repeatLimit) {- I) ^3 B6 T# M; I7 g; w
repeat = 1;( p% M' U% P- ]5 t* L! x; \
c = poll(cnt, cur);
, x" K1 ?, a# I2 S$ L( [ cur = c;3 t+ }, j+ `! O3 \6 y3 p$ P
} else {
2 V1 m' _/ @; l c = poll(cnt, (char) 0);, t7 ?7 @0 E# Z6 w" B+ u' x
if (c == cur) {
/ b. U: r) b0 e) J$ |6 Y repeat++;2 s) |2 A7 j4 O! w7 P( N
} else { C% G* j$ Q& B
repeat = 1;; n* d* g2 N, c/ K; i& ?6 X& ~- T; T6 \
cur = c;
. N- h0 j+ {- C8 O! L1 I }
* j7 }5 K( H- @! G. U }# l1 N. V% p: l+ J; a
if (c == 0) {! @) n' D) a" o, A
break;
( Q5 H3 i$ i6 A1 W }
' ?" {9 }1 K; J; D) N' E T2 C sb.append(c);
2 b! k0 U- x J3 ]6 F }" \: ^$ r ~) ]' a! V
return sb.toString();' o9 r X# c4 @4 S% U6 Z
}+ F0 [7 L9 X3 D8 Z$ R# M9 _+ O
- U8 u% M1 E. c" \; n1 C
private char poll(int[] cnt, char not) {
/ L U4 M: \7 K/ S2 N for (int i = 25; i >= 0; i--) {+ w- N- [- d l4 Z& }
if (cnt[i] > 0 && not != (char) (i + 'a')) {
/ _$ e% @/ {, P$ l cnt[i]--;! m+ {4 I. R3 T. f0 I3 G' z1 x# d/ I
return (char) (i + 'a');4 r Z- ^4 [ b0 |
}" d% `0 M7 ]2 p, w& |* ?6 q7 S2 h: S
}
1 ]# c/ m) F5 F( R* l return 0;
, H/ X4 a9 ?* a0 e- B d' N }
1 U8 O7 K, h: X u; q}
# x4 h4 W* } U) ]
- z+ A: _2 [. L2 j) z3 D+ n# Z, C- Y F
【 NO.4 Count Array Pairs Divisible by K】# q# |5 ~/ p& _' O$ C8 I ~3 @' U
4 ~. N3 F' n3 l+ y3 ?解题思路
$ ?: f, H- W5 a I5 P预处理转换成最大公因数,详见注释。
. A" @9 E9 a Z$ t+ N$ Z6 d, A8 d7 n, H
/ [, P& Z2 C3 Z' D! M7 Y代码展示; q# q D# ?4 {- _5 L
, Q+ |& P; {& D& V! ~$ r4 V- nclass Solution {: S# M# a2 X. |( k( C
public long coutPairs(int[] nums, int k) {3 d# Y! \( d; g4 H' P- U! w$ f* U
// 将 nums 转换成与 k 的最大公约数
& `0 e; `6 ?3 |5 ^' q // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)( a K( U) O3 i% M8 w
for (int i = 0; i < nums.length; i++) {& o0 w" H# a/ t" j
nums[i] = gcd(nums[i], k);
, _2 }( M) `; a }+ L+ i. z" T/ W+ K, Z3 I, S
long res = 0;. o9 ^+ N- o& W1 a, K4 Z* Z$ u
int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数
& s1 r5 ^6 G- o6 B& _1 b for (int num : nums) {
, E" z6 v) ~2 g8 V" ? // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数+ D# Q, ~ }* A1 M8 \: z6 Y6 \- K
res += cnt[k / num];
1 y9 S) q- f& R2 C
$ C2 u. P8 N& B8 X1 s$ {; { // 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++, U7 l4 v9 B) P2 r5 K$ G
for (int j = 1; j * j <= num; j++) {
0 H( O. w S6 B: a if (num % j == 0) {/ [8 D8 H9 z$ O, K
cnt[j]++;1 |- X8 G9 x5 X' w3 C5 n' x" m4 p. T, S
if (j * j != num) {
R n o$ _; o5 A' L cnt[num / j]++;. ?* W: c. H j
}, J# z2 q' Y D7 v: h
}( r9 T4 a, e/ n: s- t. B
}
: @/ D: o4 o r6 a7 e3 f }7 K& F8 f0 E0 g% N0 G( d/ v3 a
return res;3 {! ]2 U" C7 L& {% s8 D
}' J1 v) N- L" g- h3 v+ z
. w2 S- d# ~7 F9 Z int gcd(int a, int b) {% }4 }" I6 L* Y0 `' l( K
return a % b == 0 ? b : gcd(b, a % b);! u, ?5 j* U; w
}# h; l. e! ^2 G$ Y% l
} |