登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 Count Integers With Even Digit Sum】) l3 P7 y' |5 }+ N+ U5 B9 {6 C: X
8 A" }6 i7 x$ x* j u$ \8 M8 G
解题思路- \& o8 U& m" \6 j, K
签到题,枚举计算即可。
B! Q x& |5 B( Y6 ~/ H D5 w G$ U# M* b: |
代码展示# s! J! e# p+ M
' r, |* A9 D- K
class Solution {! Q( a4 L. m: {* ]- x! }
public int countEven(int num) {
2 A* F) _6 W1 H8 y8 ` int res = 0;
6 a4 |. {. }- C# L for (int i = 1; i <= num; i++) {! G8 g/ S+ I# `. g- t8 B
if (digitsSum(i) % 2 == 0) {5 t5 ]' v6 W. X3 `3 T0 Q/ u4 `# A
res++;5 G$ `) l* f5 K
}* A' b* A6 X I2 _
}
# _$ y7 X8 Y: b/ u) |' f/ c return res;
8 X- s# a `# ?4 p/ V& s% y }8 R( M5 e$ ^8 S! w
) \/ A4 r g8 j
private int digitsSum(int num) {
3 ^/ S B) i+ { int res = 0;
: N" {! @( k. e# L" H" M/ o {9 } for (; num > 0; num /= 10) {, V5 q; H; v$ O- ^
res += num % 10;4 Z) i7 f( i# w/ V; }0 g" W
} J! Q) E( t6 J# P; @7 _
return res;
8 \8 Z7 `- k0 ?3 v7 p! j0 s } v/ P) Y3 Q2 p6 o" ]9 l" J
}7 ?4 H2 ~9 ~ }' e# Y, p4 Z
8 y c: ~2 T. {6 A" |
8 J2 J1 g. A) m' h: q2 \- H2 Q【 NO.2 Merge Nodes in Between Zeros】
( J+ o- h& Y9 H8 [% b* @. [6 p# m" s6 L) U
解题思路' j5 N% q4 Q2 J9 M! A" j- z4 k
遍历链表即可。 h2 J/ t& b$ U; V$ F- s& e
8 ^2 c5 e3 i3 b, e& Y) y7 B- r% f
代码展示
( c$ ?9 h3 n- K* H* B, R& F% i: j+ a
class Solution {
1 K# \/ V+ b- [ public ListNode mergeNodes(ListNode head) {; K3 F8 N# z) s0 z# K
ListNode res = new ListNode(0);0 Q* N& u0 \3 F; b" c$ F
ListNode tail = res;" {: g1 p1 o6 v( Y/ S+ o
int sum = 0;
' p! |. _" _+ ]1 [, m$ ]" Y& T for (ListNode cur = head.next; cur != null; cur = cur.next) {
, B5 h! y& y2 {8 B q f2 ~8 ^ sum += cur.val;
b( x! l) K. d$ ^( z if (cur.val == 0) {5 G5 `( m7 L d/ u: X
tail.next = new ListNode(sum);
5 ^1 ]2 `6 \1 ^' r* G+ V6 w tail = tail.next;
* x/ \' x- H$ S& h# w( u) p sum = 0;
8 O, }3 [! B: w( }( U3 L& X }% y9 b2 ~* i' h5 E$ g$ Y% r
}
; l; j2 D4 H: E3 C return res.next;
8 r7 u/ [- a4 }/ V( X3 o( d }
" i c* J5 `% q6 B}' v4 B* w! P3 B: |
- z% k( ]2 W, h5 x
4 t; A9 U, x. J9 c5 ^1 I【 NO.3 Merge Nodes in Between Zeros】( o9 R) T) ]) X& Z
S7 p/ J9 t& i2 d6 q解题思路
5 X% b% m& b) C; N7 S7 u) M注意题目描述:“不必用完所有的字符”。所以直接贪心即可,从最大字符开始,只要连续超过了 limit 就使用次大的字符分割一下。
9 R% _' B8 h: D/ A
) f% k5 |& ?0 H9 H代码展示
. r; G* M4 b3 d: Z2 A$ m3 n9 G6 E2 K" @: ~
class Solution {0 z! v% d4 i; j" ~
public String repeatLimitedString(String s, int repeatLimit) {8 L- ?- E- K3 C% z) J: ^
int[] cnt = new int[26];
& L4 _: H0 G" }1 O+ V$ L, x1 @. ? for (char c : s.toCharArray()) {
& {0 `0 |, ?0 X cnt[c - 'a']++;8 @7 f. b2 i7 _& `# c2 Q/ P
}
5 G7 y7 \) x3 v; g$ O- J( D
' |/ c# ?, \* F/ ] StringBuilder sb = new StringBuilder();
2 b: ?) Z0 B7 g int repeat = 0;& M- y7 C, x9 L* k% @/ v
char cur = 0;
* _, _/ P: {2 m' H+ d0 }% { D" q8 U for (int i = 0; i < s.length(); i++) {. d# M7 _5 C+ |. A, A6 K
char c;% t5 @7 R! |; O. [5 A
if (repeat == repeatLimit) {
* g- N# X7 v, B( L ?/ r repeat = 1;$ D, S1 [& K* Q+ {9 p
c = poll(cnt, cur);
! _+ D: L/ m4 C* `1 m2 I b/ Z cur = c;/ \$ ?$ A0 u& S, z: V: J2 R# H. }8 J
} else {. \4 T# n1 x. f" P8 l2 j
c = poll(cnt, (char) 0);
5 d/ {* h# k# h. K& D# I9 C1 @. {5 Q if (c == cur) {) ~! g# t4 n% W4 p0 p' U
repeat++;% E! N0 \3 F* f* h
} else {& T+ d# L! ]) l q7 ], T1 ]
repeat = 1;
( e) x9 d5 `- I0 y cur = c;0 b9 B4 B d! c' A
}) I, U7 k `4 n1 L
}8 P- j a7 D/ [9 |/ M4 n8 k7 {( u2 L
if (c == 0) {4 \' S/ Q# H+ U5 Z/ V
break;
5 ?- D9 i* [" N4 N }
2 w' Y1 s% f& j sb.append(c);3 h+ N( `' m5 ]
}
6 b* l+ k) A9 t/ P0 M+ R return sb.toString();
9 R* m2 u6 y# i6 U) X( [, p! M. Y: p4 Q }. X- L5 L- A/ J
& @8 f8 x) @! P# o
private char poll(int[] cnt, char not) {) K2 z: ~# Q( ^! C/ N( x m
for (int i = 25; i >= 0; i--) {/ d' P$ |7 [- h7 g9 w, _% p% r
if (cnt[i] > 0 && not != (char) (i + 'a')) {
2 f( }1 ?1 h; F" N+ v0 r cnt[i]--;1 A7 }6 B+ }& Q) i) O( s
return (char) (i + 'a');
/ y& M E9 O7 } }
|6 ]1 j8 D8 S% Y( O1 J( b }3 G: s( }5 m0 p
return 0;
8 W7 k& ~* ?" z; J }
3 ]- |! P# ?4 [0 T( y3 M B}, g. S' k( W8 z R
) R& o' ^& Y2 P" n
4 o5 i' S3 ~: B& ~/ z" s6 w
【 NO.4 Count Array Pairs Divisible by K】4 n3 e" S3 t3 n# J
( }; y( ?4 X# E* e9 E+ I解题思路' R9 O8 w3 f3 z
预处理转换成最大公因数,详见注释。
& u E$ s4 Y# \4 L) ]+ |3 t- A
) t' W8 g. n8 D* w! F, A- Z5 w3 {7 c代码展示: M9 j! [& A1 l; \; P
0 p& Z8 Y7 g" y; Sclass Solution {9 M1 P' e/ ~ p2 @1 k3 o C2 L
public long coutPairs(int[] nums, int k) {
7 H1 k/ B3 q9 D9 T // 将 nums 转换成与 k 的最大公约数
7 Q/ h" P. v5 b0 v // 因为每个 num 中,k 的因数以外的部分没有意义 (即使做乘法这一部分也无法帮助结果成为 k 的倍数)% H8 Z) U$ x. L9 R
for (int i = 0; i < nums.length; i++) {
2 X0 X+ ?! Q u2 L nums[i] = gcd(nums[i], k);
3 V; l- Q" n( D }
0 a) |2 j4 W+ ]( V! L long res = 0;1 q7 q8 s4 \3 r& n
int[] cnt = new int[k + 1]; // cnt[i] 表示因数 i 的出现次数
1 g6 w2 p+ b$ N' ~7 r for (int num : nums) {3 t: T) D1 _# u# s4 _
// 经过了最初的转换, 此时还需要因数 k / num 即可组成 k 的倍数
/ Y% N9 t. [: m8 { res += cnt[k / num];
q# j" I7 v7 J* r. l0 u$ Y' H* n/ p5 G$ k% t; n
// 使用 num 维护 cnt, 即 num 的每个因数 i 都对应一次 cnt[i]++
( T$ T: g @, Z% y for (int j = 1; j * j <= num; j++) {3 d( [+ a9 G- }% A6 @6 ?
if (num % j == 0) {4 s) y; n" m% v8 h+ K
cnt[j]++;* ~' r% R8 t& l
if (j * j != num) {
/ j' P I# x2 F/ h q( r cnt[num / j]++;( b3 H( U. v- t* T: X
}" P1 o& q6 O& ]/ @
}
8 T5 z t+ J7 t/ H }
+ ?9 S4 O3 h: R }
' M7 C& E. B9 ^$ q, n return res;9 j5 @& V- `) u7 k
}* l+ N5 T+ L" e# Q6 V
# Z$ ?; ^$ S ^8 r int gcd(int a, int b) {
' i9 }: k6 e9 h; s% ~/ R- j* d# Z4 S return a % b == 0 ? b : gcd(b, a % b);
/ y7 }, z+ \, ] }5 l( y/ g' h0 G( N1 \
} |