登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 计算字符串的数字和】
: O. e5 j4 S7 U) r0 G+ l
2 J# O' l$ k, F" ?, x5 K8 R, Z解题思路
# \- g4 {5 f- D% J0 Q+ X签到题,循环处理即可。
2 e8 V- d1 _% V, t- m) e
% m' [7 _* E3 D2 b& |代码展示* ^$ k; f2 k) p& X: M+ n
- G9 J% S. h5 ?. r0 l" O" N) tclass Solution {
7 D1 L6 w3 |1 y5 U public String digitSum(String s, int k) {+ W/ \/ k& f; _+ b" M6 p3 e; N
while (s.length() > k) {
, _- E; V# s0 S8 R) ]& t StringBuilder builder = new StringBuilder();( Z/ ~; n4 r) D7 i8 d) P
for (int i = 0; i < s.length(); i += k) {- e4 m: K& A# {: S7 O
int sum = 0; V9 ~* `5 ^! d4 ?) h5 p4 y
for (int j = i; j < i + k && j < s.length(); j++) {8 \) ^+ M, E6 w) e+ Q$ P1 S
sum += s.charAt(j) - '0';# s; f+ N: t1 N5 D
}
7 @. O6 @5 j1 [/ h7 S( D builder.append(sum);
8 J5 _3 k6 Z, q7 l }
4 s% n/ }% U1 v* l2 ]: v) s6 x! |. N s = builder.toString();
5 H7 a) q4 n6 X) |5 C0 q6 j }
4 e" H8 p" `: O# F! R( L return s;# m! [2 x* |6 ^" Z3 J Z7 L
}+ D+ ~) H6 @0 T* g, G6 y( S3 t. q
}) U/ j, |5 y* A/ N2 \" w" {
1 l n% Y. K% u3 ^9 }
& Z9 N5 [! ~9 x/ @. Y! M【 NO.2 完成所有任务需要的最少轮数】
0 R# D9 j, L5 }% O
% Y. O; t: V. V' E解题思路5 |; c' T O2 L% E
使用 Map 维护每种任务的数量,然后使用 dp 求解。4 ] i5 E8 [% ^4 P
/ U& _$ c; [- v* ^( W3 I/ ydp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。
5 C( u; B$ J! f1 N
; U* A6 G0 }; x# q* Z& Q& A代码展示0 m, h4 y( a' U" R: A
$ N& Z+ A6 D: C) d
class Solution {, N( G, A1 p$ J5 c' y; f+ E
public int minimumRounds(int[] tasks) {
$ |/ g* l) \6 ?$ X6 g Map<Integer, Integer> count = new HashMap<>();, h& g4 ?& O4 E/ B
for (int task : tasks) {8 \' w0 b, z0 c/ g' W( P# _4 p1 c. ^
count.put(task, count.getOrDefault(task, 0) + 1);
+ Y3 |8 ?7 N' q) o }3 p, S. i+ w6 g4 H) d
int res = 0;2 m/ ?# k9 P5 V$ \2 C' y V) s
int[] mem = new int[100001];2 W9 u. L3 B2 S/ Y
mem[2] = mem[3] = 1;
& B( x: ^; ?3 o mem[4] = mem[5] = 2;
4 { |: Z) s" `" q$ f- f for (var entry : count.entrySet()) {. h6 H- Z6 ?# ?/ ?. S
int cnt = entry.getValue();
4 x; L- I, p/ o' q4 ^1 I* \/ h if (cnt == 1) {
8 o2 W$ m6 B$ o) J: b return -1;4 F/ r" o+ p" f$ Q
}
N, w. a' ~1 Z" ^6 A9 N+ t0 c res += dp(cnt, mem);. p3 p# z1 g2 V1 W: `+ a O# c
}. ]) I% I3 s7 s7 _1 C
return res;9 E! w! _! U* |0 f% L4 P' t$ C
}; ^4 @% J/ O" o! S7 c4 U
: X1 g4 P! F9 j
private int dp(int cnt, int[] mem) {
( l& ?. [# N1 O8 W* y if (mem[cnt] > 0) {
" w2 f1 _1 X8 j8 i1 {7 C return mem[cnt];9 N$ w" w8 m' h0 a$ X; H% {
}
& M3 T0 Q: \( A, `/ F4 J: J mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);
& Q; X7 r/ F2 b- @; X$ @ return mem[cnt];
# { _ n }$ f/ Y }
; L8 |( J q E3 \}9 `1 {& h4 w2 r6 O0 v$ c$ m
$ c& |" [% }3 ?+ T0 W
0 S& n8 t1 h8 g: {2 R7 T
【 NO.3 转角路径的乘积中最多能有几个尾随零】
" v! d, {/ L$ l3 A x7 b) f
2 |3 x2 J7 b8 ~4 z! v/ L& y4 A解题思路
0 y7 _& ?2 s$ U' j+ U尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)! p% `3 Y# i+ e3 S# ^( _
! v8 p- g$ O8 X1 `+ V3 S% y代码虽然很长,但大部分是重复的逻辑,详见注释。, a4 a. h/ l5 d$ J% w: S1 \# t
4 A3 ?, i: e% v' o& M
代码展示$ l( ~# |3 ^; A( u! s5 Y7 y
/ Y) e( f8 {, k5 n& N, [' _class Solution {3 A+ r- Y6 g$ J) @( j, t
public int maxTrailingZeros(int[][] grid) {
5 q7 k; p1 s; W" E& L$ T* y8 T // up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数
+ _0 m' E, t( t2 Y1 Q& d( e // up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数
" o0 N: B. Z$ d! \; C2 a int[][] up2 = new int[grid.length][grid[0].length];
$ a" i5 k; f8 W% T$ y$ Z a int[][] up5 = new int[grid.length][grid[0].length];
* r2 `9 T6 ^- r3 ` A0 g1 [ for (int i = 0; i < grid.length; i++) {; s/ B2 E# t; [
for (int j = 0; j < grid[0].length; j++) {
7 f' k( O3 A- o5 p X0 |. s0 o up2[i][j] = num(grid[i][j], 2);
6 Y2 j, n4 f. l up5[i][j] = num(grid[i][j], 5);
. `6 X2 R) M8 [5 ~( ^ if (i > 0) {* ?; R" a. d& m% `+ h. W
up2[i][j] += up2[i - 1][j];0 Y2 [ l! G& K" I
up5[i][j] += up5[i - 1][j]; s) d9 v% a0 G! K9 j6 G0 g/ P
}3 A; Y5 J. e; V V- h
}; F! Q% d: u5 T. G
}% {9 q1 k+ s" f# ?! [; t. H
// left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数
/ Q; U& g+ s7 p( k, v // left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数
! R8 ^" x; i, [$ Q$ s" v int[][] left2 = new int[grid.length][grid[0].length];
) x: X2 D B: A( p1 X( V int[][] left5 = new int[grid.length][grid[0].length];
! l; z& T; }, ~ | for (int i = 0; i < grid.length; i++) {1 T" D0 u6 y& z' \" z
for (int j = 0; j < grid[0].length; j++) {
3 G* L0 F$ ~9 z+ G7 N9 i left2[i][j] = num(grid[i][j], 2);
! E5 b$ d ^# F5 x& ~% u1 I left5[i][j] = num(grid[i][j], 5);( w/ l+ H( @1 I9 W
if (j > 0) {) s5 ~3 A& O) {8 p: S
left2[i][j] += left2[i][j - 1];
7 ?. l; [' a7 D V6 w left5[i][j] += left5[i][j - 1];( r- L7 t) w$ z/ Z. J
}
O' J/ {- I, R4 o& h }
. v$ r0 k; g+ D# \6 j9 K }
% C$ ]/ ^+ A( y: Q8 A: e9 H# r // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数' | `; Q: ^# L5 y, X; @
// down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数
2 z* K; \% S- i+ }" N/ L8 ^1 b int[][] down2 = new int[grid.length][grid[0].length];
7 q$ w- h! d5 [7 x7 k7 C% B int[][] down5 = new int[grid.length][grid[0].length];4 Q+ G0 K$ A; d$ E* L; [
for (int i = grid.length - 1; i >= 0; i--) {" a. {6 `, `0 }8 O4 V# `. d% Z
for (int j = grid[0].length - 1; j >= 0; j--) {
& n+ i6 U9 c; a down2[i][j] = num(grid[i][j], 2);
, a2 a" x; f8 \7 V down5[i][j] = num(grid[i][j], 5); b% U0 g5 E j; M& M
if (i < grid.length - 1) {
}* P/ _3 L0 G7 a+ V& A5 C) R down2[i][j] += down2[i + 1][j];
# k: e/ \0 c' ?4 ~5 q# O down5[i][j] += down5[i + 1][j];
3 V; s. b# _( u5 s& r0 o }, D* r+ ]+ t( d& A o
}1 @" }3 n/ Z9 O
}& J- x' z, M9 I+ m0 w3 ]
// right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数( m- s5 O) x: w
// right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数
. H$ O4 w. T/ I' s int[][] right2 = new int[grid.length][grid[0].length];
q( [* [' B* ~" x; ~; V int[][] right5 = new int[grid.length][grid[0].length];
8 l. m. [/ h/ B$ ?8 Y5 c for (int i = grid.length - 1; i >= 0; i--) {" c. U: a- W2 o
for (int j = grid[0].length - 1; j >= 0; j--) {
+ T5 [3 E5 {+ r, _" f right2[i][j] = num(grid[i][j], 2);
9 }+ D. P9 W. t* m& P right5[i][j] = num(grid[i][j], 5);5 W- S6 k4 Q+ F- i" v: C$ i7 R
if (j < grid[0].length - 1) {
3 J6 R4 S. M) v7 \- T2 r% z. [ right2[i][j] += right2[i][j + 1];
3 k! \* Q; o6 [7 S/ X- @ right5[i][j] += right5[i][j + 1];: N: C5 T. v" F0 ]9 U/ J9 [8 e
}
( v1 i5 s3 D8 M# _* d5 \ Y }6 {0 _0 U2 h- J0 m3 y
}! n0 w: Y+ H8 i2 I2 ^8 o5 `
: e! Y( c, d- \. j# g& b- G int res = 0;- D& S( V- T7 I% p3 f1 i
for (int i = 0; i < grid.length; i++) {, e9 O3 U' I2 \+ [7 d0 @
for (int j = 0; j < grid[0].length; j++) {
2 }* t# ]0 }" S6 D0 _* T // 有四种转角形态
7 V" o+ r. K- c+ d" B Z // 1. up + left- |, S7 L/ r7 B% p1 p. H4 n9 w" ?& Q& o
if (i > 0) {* }9 _; P) l$ O! S) N
res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));9 ?: u, H$ E' E- ~% E
}
- c0 S$ @& ]6 e // 2. up + right: B6 Q3 t2 _$ E
if (i > 0) {& E4 g4 c* [5 |4 p/ ^
res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));
/ F+ \ Z" l( A6 N' V1 q }; T( ~0 _8 D3 y8 ^" V
// 3. down + left6 c8 T0 l0 f5 \ t) J* ~1 X
if (i < grid.length - 1) {
9 y9 k+ |3 R8 [" w0 D0 b res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));' l! W1 G' T) Z5 s. M5 d( }
}
/ w. O5 u; i8 @/ P; b x. r I1 b2 N // 4. down + right
8 T* Q) }: m7 L if (i < grid.length - 1) {1 x- V. h, T& z& u* X. h5 O
res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));
' n; C5 H K1 }6 }2 R9 h }
1 {, o# `+ D- P) L$ o // 不转角
. E& e; n3 }$ X // 5. up/down/left/right; w' u, a) U1 I
res = Math.max(res, Math.min(up2[i][j], up5[i][j]));. |8 q& f( ]: G1 Q# o3 X- K3 L
res = Math.max(res, Math.min(down2[i][j], down5[i][j]));
- x9 ] `4 `) i- C res = Math.max(res, Math.min(left2[i][j], left5[i][j]));
! z/ Q% B; c# E5 ?5 I% i9 o res = Math.max(res, Math.min(right2[i][j], right5[i][j]));0 E6 w9 B* A1 S4 E/ B# o
}
5 T4 K/ d) n7 b( G) a }: ?' j8 l+ k; }7 {% n) Y# y
return res;: ^5 w0 V' @8 [6 W
}
/ q1 ^+ o" M9 B/ v8 s h; o0 ?8 Z" g: `0 a+ M2 s1 Q* |
private int num(int x, int y) {
) g8 j9 j, ~% @% S( v& S* `9 i int res = 0;
( v! f4 i K6 Z8 b. w while (x % y == 0) {
8 ]. I' V0 t7 j, R res++;
7 J+ Z" T( S8 _7 p* C x /= y;
: ]8 E: O% ~' u, q }
( v) d9 V! [8 ^ return res;4 u, p7 Z4 d' b, ~
}
) e2 R( h( U6 w}8 S3 j# t- C1 W$ R
3 ]* c9 H- G5 M9 {* w3 E. x【 NO.4 相邻字符不同的最长路径】
. ~0 \* ]& t" {0 O" c3 M+ W2 C( n4 z0 y; y3 d
解题思路( I& q7 z7 ]8 h3 M: v4 A; k5 I0 u
求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。* s( _: g) o# j9 u2 }2 v* a8 m; O
5 i; ]& [5 J+ Y8 ^9 o5 Q0 o, ?代码展示+ K7 X" q. C) S! w1 r5 o- t
2 R- Y( b) z7 w
class Solution {
Q8 H3 K2 V) M K/ M" \+ c1 _ int res;
8 P2 _6 e) `1 g
2 a+ I- q+ ~# a public int longestPath(int[] parent, String s) {( f1 [# ?% d8 B4 }1 U) T9 Q
Map<Integer, List<Integer>> children = new HashMap<>();1 s: g' ]0 ?+ {8 V
for (int i = 0; i < parent.length; i++) {
, b+ ] T/ T( U, }5 K { if (parent[i] != -1) {
4 n& ]; s' N/ Y1 P& |5 c" B if (!children.containsKey(parent[i])) {( s0 c! ?! D9 g4 a" o( E
children.put(parent[i], new ArrayList<>());
2 t3 a3 _ \2 H* ^5 }3 Z! I }
9 Q! v8 @% x. D children.get(parent[i]).add(i);2 ` L$ T8 \/ T1 E+ k% ?; B
}
1 _. d7 [) u* R# s( c$ D }
. _$ U/ t& A3 X7 {0 u7 n- r5 k
( n9 \/ |. o& n( x5 B int[] maxLength = new int[parent.length];* u* P0 T) y- v
res = 1;
2 G0 j# m; s% B- C) b dfs(0, children, maxLength, s);
, W$ z; V O7 \- w. M( x) @0 b' { return res;
( F2 Y5 N8 e P& ^; Z }
0 Q; @" c8 I& n0 W$ f( O; @
% s# c6 I+ P* I1 [1 R private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {1 O9 y% Y, g0 i3 F* z
maxLength[cur] = 1;, j( d3 h4 _3 }* g
if (!children.containsKey(cur)) {
, g& u0 Y+ y0 m6 y% o return;7 w* ~- R+ _, P/ W" B% b
}3 j8 O3 K; g$ `% A1 X& z
var curChildren = children.get(cur);
) J* M3 ^ y; ]. L9 i9 u int first = 0, second = 0;
) L2 `/ _5 }" i# D! F2 s3 ? for (int child : curChildren) {3 f, B) `! e% U ~/ F; Z
dfs(child, children, maxLength, s);
& Z. D0 m$ g" }5 D if (s.charAt(child) != s.charAt(cur)) {3 ]6 U8 v* g6 m) e* Q0 g
maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
. t8 `1 B4 P1 a: Q7 K if (maxLength[child] >= first) {
* u: G$ O4 E) ~9 a9 M& G+ z second = first;8 r- N1 P7 A# C. }- M, Y e8 K
first = maxLength[child];- |* v: l6 b5 ?+ O
} else if (maxLength[child] > second) {
& }. X' A$ H# r" h. M6 b second = maxLength[child];5 ~5 y) A h# H* G" t: j* \
}4 l; Y- s6 Q2 Q2 O% y/ y
}
$ K5 z% Q+ t0 H3 O) ~) F/ ?8 { }# c& k' M: p% M6 m8 J( _ n
res = Math.max(res, maxLength[cur]);
$ |- S- t. v; d( P$ u res = Math.max(res, first + second + 1);- Y7 N- u" z1 b H- Q
}+ E: D) V# O' x; K/ y4 v
} |