登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 Count Integers With Even Digit Sum】" s6 U2 N1 l u8 b0 a7 ]3 B4 q) ]
7 L0 V/ a1 g1 f2 `( ^: h
解题思路" `- T- ~0 o; S( w, C
签到题,枚举计算即可。
% p! e6 E* V( n7 g$ X% m1 M9 X; t* ]0 b# K
代码展示! \# k0 r0 t2 q, V, I% S
6 E! o7 Z# Y6 L; G0 ?* D& p+ B! kclass Solution {- _9 ~8 G+ `4 _) L& a( f+ l
public int countEven(int num) {5 p8 J, F( M8 x3 V
int res = 0;& R$ k9 j& I( x' v4 Y, `/ I, k, J
for (int i = 1; i <= num; i++) {
2 _/ g' Z( N6 u# p if (digitsSum(i) % 2 == 0) {
. U: B3 O$ |) x3 P* k( H res++;/ \0 ~$ I6 I9 c m0 V+ Y# |9 g) ]( n
}5 `% u0 B1 T. I! t0 X
}2 v* D2 {, r* q# h
return res;
8 r, U6 d0 i; {4 z! o8 L }
1 v# H( U/ \- i+ _3 O7 n2 j
" P, o8 V9 O6 @9 q1 K E$ |5 B0 f& T private int digitsSum(int num) {
; J( N- J5 i3 p9 _* } ^8 Z int res = 0;
7 G/ G1 \3 W4 C( Q0 x2 P for (; num > 0; num /= 10) {
' q$ c5 `, x; t9 K& K* p9 C% M res += num % 10;5 X5 @. F- y% @" K7 i
}6 V4 |3 Z, k9 m: N% @0 j
return res;
# q4 [; ^0 x+ L$ O }$ X7 S' \$ J9 ^1 l
}
- k) e/ c Z! E
% g( [4 t4 a8 x7 L$ r/ k" I9 O
% C: J0 W; T4 E3 b6 ?1 d' F【 NO.2 Merge Nodes in Between Zeros】+ A% w+ z( Z7 i6 L+ L
! k) J9 ` H) Z. z9 S& d" k# q' @
解题思路- _7 ~2 V7 c X8 Y2 u: I
遍历链表即可。* w8 V" B/ _4 o$ G4 T' r% Q
; N1 |: B; T: @- U代码展示
/ g# A$ K; h' z1 r, W5 O1 T! a) p) r6 x0 y
class Solution {8 f( c- K) ?+ k: @
public ListNode mergeNodes(ListNode head) {
, |- h# |7 C$ f- ^& K7 a( Y( U ListNode res = new ListNode(0);
n, g/ ^, i% p- W* x w# V ListNode tail = res;
: {1 P" ~& K( Y) `6 h0 y: C0 f- v: X int sum = 0;' K) I7 i# t# O
for (ListNode cur = head.next; cur != null; cur = cur.next) {
' [6 \( z6 W0 K! m4 _2 e sum += cur.val;
/ ?. ~$ F" l3 M. R6 P( x) j if (cur.val == 0) {
# C H, r+ [3 J0 Q tail.next = new ListNode(sum);& V# C, f, D( \# ]4 J2 q
tail = tail.next;
1 l1 ?2 m% N: @+ F% D6 S sum = 0;
- E8 S7 x. J6 j* v' n! [" K }
3 q: A% R6 Q/ \( k9 i8 `9 s' H }" M( V0 U7 Q4 i _# D; |" D5 q, c' k
return res.next;
k0 o! M3 r% z2 B5 _3 G0 P; O }% V* B# T( z0 ~
}
7 S, {; T3 y: Z5 n0 Y6 m3 ]$ g6 ?8 h: i
" G3 }. K: C# b& L) g
【 NO.3 Merge Nodes in Between Zeros】
; L$ w7 Y+ G* {+ z3 w: p6 ]5 H+ u. u# [" q7 ]
解题思路8 B0 |4 p5 m1 z* _3 T* p
注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。! D& t6 l6 P) G# M k
! O2 J& r6 o7 o
代码展示
0 J: Q% |6 L7 B5 u5 C
% _' D4 {/ O1 j3 Z0 Sclass Solution {
8 d/ }) q. s- x public String repeatLimitedString(String s, int repeatLimit) {
1 I+ Z+ ~8 p' s' }" s0 K int[] cnt = new int[26];
+ Q2 f) L0 [; D for (char c : s.toCharArray()) {8 P6 ~" D y5 ?) r3 y6 j! h
cnt[c - 'a']++;
9 E0 ]. o: T1 X: ?, d }
, m# v! e( H0 i4 w& w; n+ Z5 z( h2 s: s0 X
StringBuilder sb = new StringBuilder();4 p) E1 S5 l( s
int repeat = 0;
5 s5 M2 c0 F0 w3 Z& o0 i char cur = 0;1 x3 _7 M9 ^3 s9 s4 @; r5 e
for (int i = 0; i < s.length(); i++) {- \' f2 q% {8 l
char c;
i" L, `+ m0 B; `0 n. Q5 H if (repeat == repeatLimit) {
) f M% b$ |0 r& I repeat = 1;0 w% Q3 v$ @0 o# G* E& J" E
c = poll(cnt, cur);
- n) l' u+ Q" X1 r3 s# s2 e cur = c;
+ p5 Y( Q" @- S1 p4 e7 ^ } else {
+ F: X I7 k* Y9 u1 G, H c = poll(cnt, (char) 0);% C, r; D6 j7 i- c8 o$ g
if (c == cur) {
+ l S0 F: U7 m2 `4 f4 C repeat++;
" ]+ ^5 h' L, i1 p4 R } else {7 W" }! m4 w2 f! ?6 s. b" i
repeat = 1;* g( X& f) P( h& F6 D. J3 F
cur = c;
4 J {8 F+ c p }
3 H" c% U( {# |' W+ B }
. Q) c7 e) C$ W; ?, K if (c == 0) {: \1 ?* z7 f k/ P
break;, G, b1 S2 Z6 v, r" q) b2 P, M
}) D# ?# J3 c1 y t
sb.append(c);
+ I6 @4 y0 O0 o7 D }4 v6 P" e& e: L+ I
return sb.toString();) C4 [2 t. n3 {* k7 n& v
}8 X, x+ \$ j: z& c
1 m, d R0 {! e% g! n3 P; l9 n private char poll(int[] cnt, char not) {; O) A0 j8 h* u1 O9 I
for (int i = 25; i >= 0; i--) {
# L7 P o) P1 H9 M0 P if (cnt[i] > 0 && not != (char) (i + 'a')) {
9 \4 L' N" b$ T' U. S# m( ]/ g cnt[i]--;: {+ f6 k! d+ Y/ Y! N/ x1 s
return (char) (i + 'a');8 |, L) B& c5 e1 Q. I
}
9 `1 u* p! L, n4 | }
$ S1 c$ G5 C& { S4 { return 0;
7 H# z6 U! E, u& q- W' L ^2 y }
) f1 C' o1 K3 [ z$ N0 j}
; h4 d' K$ K5 Y2 \' ?# y4 o# r' o1 R5 l# B, T" l- b# k8 T
6 p4 f2 j+ T6 K" o9 s9 s( k, f【 NO.4 Count Array Pairs Divisible by K】% ~% W( N/ [1 k! x8 ^
- P" L0 U- e# J% s9 M解题思路
3 l4 l" [, o g- Y- H! {) ^预处理转换成最大公因数,详见注释。
1 M* {# [) `* z/ h9 R! Q: E5 V: N/ Q
代码展示6 L8 v5 C4 G e; A$ A+ ^
. E, ? U% \% o& w
class Solution {- I' h& A' k& Z3 a0 P3 ~
public long coutPairs(int[] nums, int k) {6 `$ }0 L& S% z6 v: y& B# c
// 将 nums 转换成与 k 的最大公约数
0 X5 h1 H3 B* R6 [) {8 T // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)
5 _" K8 H6 u" ] for (int i = 0; i < nums.length; i++) {
! K# a* V1 z' q nums[i] = gcd(nums[i], k);
9 F& Y' J$ B: I0 t }
) s/ j# ~0 W) f long res = 0;
+ T* e( ]3 _: N int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数
- j, j# G* d V: |6 s) Q for (int num : nums) {
, P: c8 L3 I Q0 x6 } // 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数
/ a, R z7 d. e! X5 v5 o6 y/ E8 D res += cnt[k / num];
$ D& l% q- t- _$ T! I% w0 S3 {# _$ F% A% e5 U
// 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++* I# b% f p) o! l2 ?7 T* \' q
for (int j = 1; j * j <= num; j++) {' c3 d' A3 d6 t9 G, c% H6 Z, r
if (num % j == 0) {3 G1 y# M& A2 J( _
cnt[j]++;
& W1 G$ S* G g, Z! o6 a$ h if (j * j != num) {
6 x) R4 z+ V& h cnt[num / j]++;7 m: d2 J& |% p7 z+ y) Q
}
; c" E; {6 e$ I }
% I+ A. b0 ]+ q. ]& J) I$ c }. A) L% R/ {& F( G# j
}
7 |6 K8 j1 Z E* e- x return res;
2 j+ C+ E8 [$ a& A }
3 g/ a! o! y2 A8 J. P9 i
3 x8 j+ Q5 \+ _/ X# I+ B' T int gcd(int a, int b) {. O& h, ]6 G2 v
return a % b == 0 ? b : gcd(b, a % b);! K! V: `( P& ]* q* m' i# b
}7 E6 A3 t2 R6 z; E) r& a
} |