登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 计算字符串的数字和】
( {7 m3 [ }( |( N, f+ k8 l* {; o! v% _
解题思路" x$ z* \* S2 D X* t" e
签到题,循环处理即可。
) J( }* N% [+ y( V2 j- X( W4 o) v J2 Z: w* t
代码展示! a$ S# E5 P1 H+ Y7 v" U
% i: Q+ {2 Z( Z1 B+ x$ e
class Solution {, d4 W& T7 c1 r! I" I/ i
public String digitSum(String s, int k) {
6 ~. u' W1 i6 O+ [ while (s.length() > k) {% n6 b8 @$ i4 W; `7 O' l8 A$ W. w4 u
StringBuilder builder = new StringBuilder();
4 f x# D. [/ t" ~* D( q) ? for (int i = 0; i < s.length(); i += k) {2 D9 `* ]/ w3 D: {7 J
int sum = 0;% a7 Y; O8 {) w: y' u+ h, Q7 @
for (int j = i; j < i + k && j < s.length(); j++) {
9 C8 y1 D: `0 \3 o2 E sum += s.charAt(j) - '0';$ J. f, u7 M* F- g2 B& W- S
}
$ m) @/ b+ k' d builder.append(sum);7 u; m2 O/ I4 `1 c0 U
}% v% g7 d' I ?/ }
s = builder.toString();6 }2 s J4 Y1 B, u2 V
}
$ m3 `, g- P h7 o# h: x8 ?2 \ return s;
6 k# h& U: b; w& k. V7 G ~ }
& V2 \, s" R0 C& Z1 W}
$ d/ l/ h4 @0 }/ E3 s' _4 q" j3 B+ V `6 Y6 V& G: |
! S& V ^; P6 b【 NO.2 完成所有任务需要的最少轮数】. t& d7 Q+ t- Q: K! Q
6 V, x- e. I8 L) V/ \解题思路
# M7 _% X5 d: i8 o' h- H9 c6 q' W7 C使用 Map 维护每种任务的数量,然后使用 dp 求解。/ f/ a* `+ l$ v% ^
3 v1 X" _' o( Z2 t0 D6 A* z edp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。
$ P1 _0 t$ } U% \$ [7 m
6 }( d+ T/ N- ?2 ]- o代码展示( _$ ]0 N: e3 D* C, i
3 S+ l. o3 k% a" I" P
class Solution {
4 B% w6 z6 Z9 c public int minimumRounds(int[] tasks) { Q* N0 I# ^1 D/ E: X4 x& N
Map<Integer, Integer> count = new HashMap<>();+ g* s# l' y$ o
for (int task : tasks) {' h3 m0 [7 `) T7 }* {7 x9 f9 L
count.put(task, count.getOrDefault(task, 0) + 1);% O4 S3 P; z: t8 R
}" \8 F. I7 e! y1 E* v; s
int res = 0;
3 w; e+ I' N0 ?. c int[] mem = new int[100001];' ?8 \+ G( Y, {9 }" p, d# g/ j: {5 O
mem[2] = mem[3] = 1;
3 Z0 e9 g% A* p1 k- @ e6 ]2 p0 H mem[4] = mem[5] = 2;1 j/ t, {# _6 S3 `. H! t
for (var entry : count.entrySet()) {" z8 A( p0 m) M' `" Y
int cnt = entry.getValue();# z4 N/ h+ A! E4 V8 ~& u, l# c k
if (cnt == 1) {$ G# g: c! s# B9 L3 ~
return -1;
2 n8 F& D# V3 j2 A }
+ ?! S0 ~6 A/ o3 I res += dp(cnt, mem);
5 P) {5 r) `2 x! a+ Z }) G8 n* |, p; i4 \3 t4 r- B. Y
return res;/ S: y5 t* F/ j7 t) F5 ]# j X
}) M5 ~3 ?" P1 y6 j' {$ _
) J. E- L" r: |# k/ v
private int dp(int cnt, int[] mem) {6 H9 I8 v5 M; n( N+ @' u |; ]. _
if (mem[cnt] > 0) {
* a6 t# B" w9 f return mem[cnt];
2 a {8 |8 V+ M: P. H }! z: C) p& T }7 Q/ ]
mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);
5 j8 T$ s4 y2 O return mem[cnt];8 q- | F# r5 t6 `5 B. b
}/ y. y$ U0 _" \2 G" Y
}( Z: [# q6 K" I) W; o4 H6 p5 p( \
% X( w6 c% m& x0 ?$ g
: E8 k; j5 U9 G1 H/ A+ ]& m6 R* }【 NO.3 转角路径的乘积中最多能有几个尾随零】( f6 l8 q4 w- V$ r8 z
6 c+ C: V9 K5 d' w6 e& ]解题思路- E* ?3 _+ K1 b# N
尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)
% @9 o) ~: ]% m6 \% |0 G4 f. o7 R% g3 v1 u" g) z
代码虽然很长,但大部分是重复的逻辑,详见注释。1 s' p7 u4 e8 E" s5 u& c: [
# I* B0 I3 f3 ]0 x- c" c代码展示
- [. m% O, N) K: P6 E1 X- R5 `. B" P1 J/ i7 H9 B, T+ i* }
class Solution {
: x5 B! q4 i- f a: U" W public int maxTrailingZeros(int[][] grid) {) s: i7 Y" v3 ?8 h$ t2 W( R
// up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数+ v6 _2 y# T& P2 O* U
// up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数" h2 }( P. v a# o6 w; C
int[][] up2 = new int[grid.length][grid[0].length];7 r8 G5 }3 k$ x! F. G3 K `7 J% [
int[][] up5 = new int[grid.length][grid[0].length];
|0 n: Y( v; n$ ? for (int i = 0; i < grid.length; i++) { H5 _/ H) b' H; Q
for (int j = 0; j < grid[0].length; j++) {# {% Z0 p( D! s' M
up2[i][j] = num(grid[i][j], 2);8 L V$ [/ E7 q
up5[i][j] = num(grid[i][j], 5);
8 Z" J: H3 P6 y7 o5 U* \3 Z2 i if (i > 0) {
& w. S6 A! `7 s; @, F4 ] up2[i][j] += up2[i - 1][j];
" S( f( z% b; F( t: \ up5[i][j] += up5[i - 1][j];# f0 a+ O# E* P: w8 c( k! Z( k$ O
}
; g0 B3 o. M5 F" F& r& ?: I6 ? }! b/ _& ?; T, |5 H# ^, y
}5 b* _5 r) D* n* S1 ^! y: e' \9 h1 F
// left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数
: |* R/ S. R$ ]/ p. j6 C1 o! u // left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数
/ F( n& v/ V* E3 _6 ^2 M- L int[][] left2 = new int[grid.length][grid[0].length];* I u O2 q2 P% V9 q
int[][] left5 = new int[grid.length][grid[0].length];# g" W! e% C& z0 z/ b* }% h
for (int i = 0; i < grid.length; i++) {
' {$ d' `; m# w* C for (int j = 0; j < grid[0].length; j++) {
0 w/ l6 \6 @! R' f& ~: _ left2[i][j] = num(grid[i][j], 2);* } h. Y D* Q) b% D6 H
left5[i][j] = num(grid[i][j], 5);
* Y4 Q1 e0 q1 X& n7 k( r. \ if (j > 0) {
! `. h) D. D( X, w2 e& e N# ^0 M left2[i][j] += left2[i][j - 1];
7 ^$ b" N9 H9 G( f5 }* v left5[i][j] += left5[i][j - 1];
" i- M1 |2 K# u. M/ } }
2 m$ ^+ T* Y# F' e# ^3 a }
7 W% S( |& F! i8 e }
/ i. O. L- {, B // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数1 V0 t3 a% m* @
// down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数
+ F8 r: U; W5 S int[][] down2 = new int[grid.length][grid[0].length];5 z8 B x1 T( M" v: _/ D
int[][] down5 = new int[grid.length][grid[0].length];. k+ j4 K3 J: |: U1 }* v
for (int i = grid.length - 1; i >= 0; i--) {7 \. V8 a9 ?* E2 z, ?# U
for (int j = grid[0].length - 1; j >= 0; j--) {# _$ [% ^. T/ \ ~
down2[i][j] = num(grid[i][j], 2);8 h. {) o3 A4 n0 r
down5[i][j] = num(grid[i][j], 5);
' S& y0 P0 E7 ~' B if (i < grid.length - 1) {
7 e% m$ G* z- {6 j$ b down2[i][j] += down2[i + 1][j];3 N% Y1 R7 [: { i
down5[i][j] += down5[i + 1][j];
( e" c9 E0 s, V, b! z8 n0 k }! @' ~) R3 g! K2 p3 e6 \
}' F6 B# }& d, A* }1 Y4 Z
}
: R" o* f% j- s2 M. V, H) { // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数
. P/ X. _& x3 y // right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数
1 l0 V: j8 d* l l# n( a int[][] right2 = new int[grid.length][grid[0].length];, q1 o7 Q2 I& I. U: Q
int[][] right5 = new int[grid.length][grid[0].length];
) |4 H7 C8 W. ~- p0 d+ E for (int i = grid.length - 1; i >= 0; i--) {
& f# ?, x2 k8 \3 c( ] for (int j = grid[0].length - 1; j >= 0; j--) {
% _/ \+ p( H; P' L! B right2[i][j] = num(grid[i][j], 2); S2 R) Y; n5 t, z
right5[i][j] = num(grid[i][j], 5);& x0 {4 x+ l, o9 ^3 a
if (j < grid[0].length - 1) {
% \+ a$ ~4 |9 p ?" }# y8 j5 v right2[i][j] += right2[i][j + 1];
5 q, z: ?/ v, J right5[i][j] += right5[i][j + 1];
' U5 e( S& Z3 G, P }1 c( Q0 g4 s8 }. x; @
}
# o, W' T' l* |5 \4 |2 C* k }+ I% s/ Z. o& H' @3 k
6 \8 n* |$ ^% p1 @: C. L, C
int res = 0;
) A: Z7 U! X" \. C: N$ {8 H for (int i = 0; i < grid.length; i++) {
9 ]+ j* N ^' ^0 ]" I6 a for (int j = 0; j < grid[0].length; j++) {
# e) _: `9 C w( R // 有四种转角形态
- ~, q, x$ C( B // 1. up + left; n7 r* O, _1 r2 F; I
if (i > 0) {! q1 C0 t0 Q' L, K
res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
# }# u3 S! r" @. F- o; Y }
, R0 x+ S0 v( S0 S2 s6 o& r) z // 2. up + right
& l7 N5 O: C! I; G7 t0 g I" u if (i > 0) {
# }! f3 k1 q4 i. } j( d res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));* e$ c' V9 B! Y
}: E% Z1 c) W' `- Y- c s& n' \3 r6 t
// 3. down + left' F+ A7 X. r5 p0 e1 q# b
if (i < grid.length - 1) {7 q* B' c6 [$ V" B
res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));
4 _ A; B) F; x# P3 e/ L$ \ }
- Y- d- m# B& Y* B" p' T4 ^! W; f: r // 4. down + right
0 ~- N0 L/ j( H5 e- y5 R) q! ~ if (i < grid.length - 1) {8 u0 t1 n$ Q. O5 L$ I9 m
res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));9 ~# ^( W, Z4 O5 z
}: D& f$ u- O" p( K" ^9 f
// 不转角7 K) X- r! z+ v9 u; E
// 5. up/down/left/right3 s4 R7 f6 A" s5 ~. l
res = Math.max(res, Math.min(up2[i][j], up5[i][j]));! w- W7 O+ v$ Z2 C9 M `0 [: A* I' t: A
res = Math.max(res, Math.min(down2[i][j], down5[i][j]));( M; Q) t. @+ w( K+ L/ `3 y
res = Math.max(res, Math.min(left2[i][j], left5[i][j]));
$ J9 D+ m5 k4 Z1 Y1 S7 j res = Math.max(res, Math.min(right2[i][j], right5[i][j]));
7 m. ]+ f V* R* R8 n; K }# ] z0 Q/ V5 m* y) k) O6 T
}
+ R/ ~ }3 H* { return res;
! E! ], i8 n4 E7 c6 j' t# h }# E: X! Z8 e- G/ F
1 `" n M- Z4 k
private int num(int x, int y) {
: x0 c2 K& p( ` int res = 0;
5 m8 @, f x! Y8 Q. g8 a/ q while (x % y == 0) {0 C! ^) y! a3 Z, v+ @
res++;8 \2 R6 ]+ d4 l# n
x /= y;# d8 v7 c7 ?- ^4 N& b
}
9 m2 G0 w% y# ~# [: n8 p% V return res;6 @) t/ q- E" x" K% E- ~( p0 D2 E
}' g% Y2 H2 B) M; t7 c
}
$ \/ Q( k6 {& ?' t- _3 g O& ]3 Y: o2 i
【 NO.4 相邻字符不同的最长路径】
6 l# ~5 ~& o( f3 ^, N+ I
x9 m$ B/ R/ q/ q; p. E& a7 x解题思路
0 i( v! r' D4 k# v7 U% `8 u求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。$ V" }4 y( E$ Q, @( N* l
1 J1 u* f. z9 I# u( }4 H
代码展示- t- v9 t$ T- i9 K/ r) }% W& P. g
7 Z0 \' H* t+ U9 z3 R, r7 N, yclass Solution {
, i* D6 j. Y+ ?4 r4 d; V2 X int res;' h, ~6 i5 A# I6 c7 s E# }
# H) \; e0 I: I/ S3 ^+ x public int longestPath(int[] parent, String s) { o0 B8 x- f: B
Map<Integer, List<Integer>> children = new HashMap<>();0 v8 e* M% P! w* Q5 C4 M4 G
for (int i = 0; i < parent.length; i++) {
% X) q4 \* M9 ]& ^9 G if (parent[i] != -1) {) @: Z V( ?0 `
if (!children.containsKey(parent[i])) {$ u* D0 b/ L2 y# G7 O- k( Y
children.put(parent[i], new ArrayList<>());
3 W- j( ?: {1 Y6 K! z- x. i% f }7 h. x3 @, W: a7 W
children.get(parent[i]).add(i);" r; n8 C8 z' v5 t" V' o! o
}* z7 w7 n" Y! }# V) E
}7 ~3 W6 t- r0 R# u
0 I- q; z' m, r3 p, k# }$ U int[] maxLength = new int[parent.length];
; |+ |8 J" d" I! J. }, J res = 1;" r. {5 J: @7 h% }" u
dfs(0, children, maxLength, s);
C0 d) t7 b6 T/ O$ ` return res;* C0 x/ U* Q0 f- i$ B. ?/ j5 b7 p/ {
}% ]# w& o9 ~: S2 Q6 B1 W& D$ L
; ^7 n( ~* I: q7 |3 {, q; O5 I
private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {8 j0 F, U" d& x
maxLength[cur] = 1;
6 ]7 D- D7 n: v j3 _. M if (!children.containsKey(cur)) {# C! `" V/ Y8 E3 n( g8 [
return;
/ v+ d \0 ?- S: N; S }
9 M" \) {$ v& O% z& W& Q var curChildren = children.get(cur);
( l m7 x) M' U7 S int first = 0, second = 0;* d1 o* M$ P2 J' w
for (int child : curChildren) {# H; [+ i! p; g! W, B# k- W. w
dfs(child, children, maxLength, s);) S8 ~4 l: n6 l0 y3 }: H- Y0 a+ z9 }8 L2 U
if (s.charAt(child) != s.charAt(cur)) { W6 m! ^. l+ P5 R& B& Q
maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1); l' v6 S8 G$ E4 a4 [. M
if (maxLength[child] >= first) {3 Y: L3 n) V8 n, M
second = first;4 U; s1 R" Q7 W4 b6 M" `- o d
first = maxLength[child];1 ~) r% t$ z4 t' O8 t* k P
} else if (maxLength[child] > second) {/ _% @ r' u/ J/ H( L6 F; g
second = maxLength[child];# H" g/ h5 S i1 r3 g
}
, o: I2 q; C: @ }8 e$ j# J6 d- O/ m
}
! \% Z; [' T" ]( P3 p$ T3 j res = Math.max(res, maxLength[cur]);
, i4 N6 G* F0 k% R, z- l$ j7 u res = Math.max(res, first + second + 1);" F- T( a. h4 {
}# `3 l/ z& p" l: i0 D
} |