登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 计算字符串的数字和】
O T2 y8 a w: v2 X/ Q" h; z) w
/ e! o& ^- B2 K解题思路
! y: x/ h; m+ h) c签到题,循环处理即可。
' N2 ?: T1 j1 h" i
& G/ D) j* Y) C7 y. z' P2 j) ]! k代码展示
6 G$ F' r: D( E) q( l7 n
" I+ k* e* w* e6 [5 ], H5 b8 lclass Solution {+ H+ ]7 G5 J) D/ O0 W0 r
public String digitSum(String s, int k) {6 F$ E/ S4 K d8 F& w' @5 e8 i
while (s.length() > k) {
8 s. @9 Z3 u9 z$ b StringBuilder builder = new StringBuilder();
9 o( f+ o1 I& H# h1 D1 p+ M" h( [ for (int i = 0; i < s.length(); i += k) {5 r: g- d, M7 ?! i6 q
int sum = 0;1 F6 M: y4 W' v* |$ X6 Q
for (int j = i; j < i + k && j < s.length(); j++) {1 F9 ]5 Q8 @+ M) N& k3 F/ C9 o, S
sum += s.charAt(j) - '0';8 @/ Q* A$ W2 [
}
( `' ?- W2 s$ b/ _; { builder.append(sum);) C6 s" k3 \% t5 X" v3 H6 p) Z* s
}% k& n. P' {; U+ h- o" C2 a
s = builder.toString();
+ d' {( j: p" Y* J9 o4 n. H( Y }" K/ S4 J$ h' \
return s;
: V* J' R; Q; [# c% F [8 \ }
! a* h4 o/ }# m. \( M, ?}
+ i' m# p$ D% u% |: P$ \! q; }4 T7 b, K0 g: i
& k+ ]' s8 ?3 }# F: `【 NO.2 完成所有任务需要的最少轮数】* [' G7 G- j5 ]( W& P
1 \/ k, ~0 Q2 o, s5 H& N
解题思路
5 M2 E0 G. S/ R6 D使用 Map 维护每种任务的数量,然后使用 dp 求解。( `4 x/ X; j- U# t: O" Z
! J$ X2 ]6 Z0 B# @ |# R' rdp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。
8 P, a2 M+ a) |6 y3 E1 O$ q" Q7 i7 w4 J! D' o0 @2 ^% G3 _
代码展示
# u; g: K+ ?3 G4 g1 b1 }/ P+ G9 M6 |# `. E" H' I! O
class Solution {0 v! _; X0 I$ g; E5 m4 j( E
public int minimumRounds(int[] tasks) {
4 @' r% K# m! J% V2 g Map<Integer, Integer> count = new HashMap<>();& A1 @' D2 o' r8 I
for (int task : tasks) {
+ y8 G! r$ q) U7 g- ^ count.put(task, count.getOrDefault(task, 0) + 1);* Q" \+ a2 D! ]# j8 w2 S
}+ [ a: k$ F- d4 s9 A
int res = 0;
+ [( z4 e/ ^/ f0 l4 o# g int[] mem = new int[100001];, N u5 x( s' l. L4 Y3 ^' Z
mem[2] = mem[3] = 1;
& j0 V) _ q- m% _ mem[4] = mem[5] = 2;' W! m7 U, M0 Z( {
for (var entry : count.entrySet()) {- ?! Q; m$ e6 c# L- m
int cnt = entry.getValue();& P4 w6 ^8 T( T8 @4 E( A" W
if (cnt == 1) {1 N; i- i) q. T0 W1 \* p
return -1;
& s5 ^; P) w' \/ X' { a) t% p }
2 K: o+ }* S, k1 p- @ res += dp(cnt, mem);
0 j, x: E7 p7 h$ i }
. _% j K" ~3 p* m$ N* L Q return res;5 Z( i9 v- y/ E$ E* n
}
5 v/ N9 f/ b W! L1 ^; S' Y0 g/ c& T9 W/ f3 Q4 ?
private int dp(int cnt, int[] mem) {, v$ s( d9 M: {
if (mem[cnt] > 0) {
: U/ E* {7 T- a5 p# x2 g8 n return mem[cnt];
. m) _# |" u% l( c0 l4 k8 W# \* s }
$ i! r9 _& k/ [2 N6 C mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);2 i1 U8 T/ Q( ?" \# \
return mem[cnt];6 G9 R# \+ K' t3 T, y( i9 E1 ^2 b5 ^
}
% b- m8 s# O. n. V}
6 P3 U) q$ D8 v$ ?8 D+ g+ n; v: }
0 u& x5 y" h: n* B3 j- d* m8 X- Y9 c. |. Z* Q, @2 b! |: ^# k
【 NO.3 转角路径的乘积中最多能有几个尾随零】# v$ `1 b( v+ S8 s
T5 F% m; _8 ?, s5 I4 D! }" x
解题思路& l: V" p7 f& @3 h
尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)/ j; A9 o; `/ F
- E: G$ I+ \% e4 }5 d3 F+ @代码虽然很长,但大部分是重复的逻辑,详见注释。
- l4 U5 @: O8 d% q5 ~* W) h. v& W% Y o
代码展示
0 x6 i9 A0 R3 t8 b# S0 _
# F: V* i* @0 s) _7 mclass Solution {
7 q5 X2 Q2 x4 \- C public int maxTrailingZeros(int[][] grid) {3 L' P, `$ Z! g3 x ~& q( b
// up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数
) e* |3 N! p9 M Q6 w // up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数) Z. v1 ?# u! I+ Q$ Z1 S
int[][] up2 = new int[grid.length][grid[0].length];+ m( X& R7 m# O5 W. E
int[][] up5 = new int[grid.length][grid[0].length];
1 E8 T1 r- ]! ?' o' V3 K; c for (int i = 0; i < grid.length; i++) {
% i, U) [9 t0 c( [; `0 L1 ?+ X for (int j = 0; j < grid[0].length; j++) {' S0 @- t: j9 R' ^3 {
up2[i][j] = num(grid[i][j], 2);
2 I' A3 l M; S. @& u; J( }: D4 B4 n up5[i][j] = num(grid[i][j], 5); B1 i9 w K: K( n7 r, y, u, q! L
if (i > 0) {3 q$ x( v9 I l- H) _
up2[i][j] += up2[i - 1][j];7 F* ?/ P) @3 y k5 ?% l
up5[i][j] += up5[i - 1][j];
/ T+ A# R" u& s1 j }
: \; c" `' h6 x5 u @/ ]7 I }, @$ m- y+ ~2 _* O$ `# }
}
6 P. Y8 Y3 N1 |. T: D7 _ // left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数; h" B( Z5 _( q6 K5 b) j* {0 i* ~5 R" @
// left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数# \$ x3 C5 T7 l* L( f+ F
int[][] left2 = new int[grid.length][grid[0].length];
: d. x' S; F0 y8 h C int[][] left5 = new int[grid.length][grid[0].length];
2 ^: N4 \" p2 I& ?8 { for (int i = 0; i < grid.length; i++) {
6 j5 ] F: @) }% D. L for (int j = 0; j < grid[0].length; j++) {# t- D" K, l" ?5 K c7 s
left2[i][j] = num(grid[i][j], 2);1 E* |) c9 x) e j( Z% c3 P7 H
left5[i][j] = num(grid[i][j], 5);2 |/ o. }% O! p/ @
if (j > 0) {# A! A, T( w% Z4 {' Y1 b* I4 K t
left2[i][j] += left2[i][j - 1];9 P8 D+ |$ L, v7 b
left5[i][j] += left5[i][j - 1];
a/ l+ u! G0 ]. h5 [7 k }0 q9 p) E! F* _' z
}
& h# M; @$ q6 O7 r2 P }0 k. t. ^: c$ @4 S+ a
// down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数8 g* j2 b; g# t& B- I
// down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数1 X5 }9 n* S4 O6 ^" i
int[][] down2 = new int[grid.length][grid[0].length];
" B; s) h4 s F4 K( n- m9 [ int[][] down5 = new int[grid.length][grid[0].length];
( W1 o g' m& |8 S8 v* i for (int i = grid.length - 1; i >= 0; i--) {' m; M3 j0 o& Q+ i
for (int j = grid[0].length - 1; j >= 0; j--) {
6 s/ ?1 `' k: J1 s: M down2[i][j] = num(grid[i][j], 2);* @$ u- b; g! s+ y7 E
down5[i][j] = num(grid[i][j], 5);# j% G0 N& h. I
if (i < grid.length - 1) {
5 f3 n4 e8 ?- s0 I4 G/ N: D down2[i][j] += down2[i + 1][j];# _( p4 c5 a+ z. U( K6 s0 X
down5[i][j] += down5[i + 1][j];
$ w$ @% e$ j4 y& \7 {" w }
0 V5 \. M& t2 r1 S }
- n% ^# w& z2 V! w( O( N }
4 B9 y; X+ Z* H' Q, p5 d# {/ G2 U // right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数" S' j7 l2 w2 H
// right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数5 ]% N$ m. x$ k9 u- G+ p" g! _* X
int[][] right2 = new int[grid.length][grid[0].length];/ r4 o& P% T" w; Y7 D' z6 G
int[][] right5 = new int[grid.length][grid[0].length];
w8 V& N( q0 v: ^8 \: I0 l for (int i = grid.length - 1; i >= 0; i--) {. j( R7 B- J4 o% I) p; T9 f
for (int j = grid[0].length - 1; j >= 0; j--) { |3 i% p# D& @3 L" v6 F
right2[i][j] = num(grid[i][j], 2);
& Z- N5 o, W0 @: f5 V right5[i][j] = num(grid[i][j], 5);& G3 D" L5 \4 d4 r3 O* R/ v0 [
if (j < grid[0].length - 1) {
/ @) B, D! G" w/ { right2[i][j] += right2[i][j + 1];6 W' L% V* O9 W6 ^2 m' b8 z
right5[i][j] += right5[i][j + 1];
5 r2 x* B9 R3 C3 B }
% n, x3 n) B# J }
d$ X$ d, h+ V }
% Z. N) p) }0 N% Y) G9 z3 ?( i) |" p$ O, d: _
int res = 0;( K: j; y! `3 F. i. f+ m
for (int i = 0; i < grid.length; i++) {+ E2 I/ O3 M5 b" x P4 P
for (int j = 0; j < grid[0].length; j++) {
/ W/ c1 i U% G+ F. e // 有四种转角形态
1 p/ p8 h- i% T // 1. up + left& l5 g7 q6 b' ?' V7 X
if (i > 0) {# `7 r, W: `# f' G* B
res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
, k3 q C: f: n1 g }
$ H5 p, _ _) o* E+ H // 2. up + right
. P" D- o6 o" Z$ @3 a7 G if (i > 0) {4 O4 \. U" J9 a* k7 F
res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));1 u! L$ `4 p5 g: x9 j& d3 G2 |4 w
}* v8 {+ H: v, {$ d) O" w6 Y
// 3. down + left
& `$ o8 {( L" }; i0 a if (i < grid.length - 1) {
6 C G, b. i, W! y- q res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));/ U" e5 b3 z0 \- x6 v
}
) j6 Y, ]7 R9 i/ l7 {7 R // 4. down + right
- p: J# k# Q) { if (i < grid.length - 1) {% Q$ v" c$ r# M [
res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));, u% R2 P f2 n3 l1 r* Y
}2 I5 ]0 ~' S9 U7 [# V
// 不转角 \ e7 l. G* V- a! D
// 5. up/down/left/right
A. j& G0 d6 l6 k+ z% U6 J res = Math.max(res, Math.min(up2[i][j], up5[i][j]));
* `! w$ u$ a7 j- V- Y# ` res = Math.max(res, Math.min(down2[i][j], down5[i][j]));+ ?" w- S2 H- u, K, s, h
res = Math.max(res, Math.min(left2[i][j], left5[i][j]));
5 Y% H4 O1 Y# f res = Math.max(res, Math.min(right2[i][j], right5[i][j]));
6 x% W7 F( u# F1 S2 O }4 [% B5 a+ G" |& e3 K" J
}
- `& c& R/ @8 w$ k0 l% J, f return res;
6 f: ^" L# K7 Y3 X" ?1 z3 U }- {4 G9 g6 y. H5 c" y2 N% j$ o
: q- ?+ j9 f/ X& S$ `
private int num(int x, int y) {1 j& `2 U U' b
int res = 0;
8 M9 C2 [* G# S/ I while (x % y == 0) {
1 I1 h! f* d5 e& A$ J2 O6 J res++;
' v* A. |9 Z0 e9 F9 A- ^+ t x /= y;
; L/ U; K$ T; s0 J }
/ u3 @! ~3 {4 I O" k3 i6 ^ return res;+ I8 Y3 a4 P. B" D
}
% J9 q5 z, ?2 p: J6 y0 a' K* c7 }0 J}+ S: E" B m, g
; T& t+ P" \( L. v; O( X& _【 NO.4 相邻字符不同的最长路径】
4 _/ H ]; s' g. a; f, t" E+ T1 ` H, u3 i) R9 ~! F
解题思路
# R; w) |' R9 Y, B5 d3 [求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。
; _6 H& p) Y M4 ~, q o. ]- U9 v. j0 |1 _& G6 M$ n
代码展示
7 [/ z e: q8 G
" W- r8 E3 k! T, Zclass Solution {2 S8 `* \& X. P% N9 g' w( h
int res;2 u) W2 L* v D! ?( a; U+ S" T
; H' [9 j- O7 g3 _: O) Y% {( p public int longestPath(int[] parent, String s) {1 n2 z6 {. _, {. M: E" v
Map<Integer, List<Integer>> children = new HashMap<>();
# j. I# U- x2 ^; T" D, Y for (int i = 0; i < parent.length; i++) {
1 R1 ]! H: m: V& T: x if (parent[i] != -1) {: Z* f# w: b S6 t$ X" q, E: L
if (!children.containsKey(parent[i])) {$ n! y3 O9 w% P$ r4 K5 G5 U
children.put(parent[i], new ArrayList<>());
" G3 L. a8 [7 I }' M' d! T9 n* @" Z# ?
children.get(parent[i]).add(i);; `2 o* t( e/ Y# g2 r
}
7 d. s# a3 b, @; _ }2 ]3 t; u* u# v$ q5 w
0 n* R; {; x2 x3 g- m; U int[] maxLength = new int[parent.length];
/ ?9 M' g1 R2 V3 P8 z; q, ? res = 1;
$ w4 F0 W6 ], S: K. j dfs(0, children, maxLength, s);! I0 W) r4 ` ^, Q' B" }
return res;8 n1 E) T0 G* v8 a+ `* p d
}4 a7 V _, k9 ^
, M2 B' w* ?6 X' h private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {
& M/ `2 s0 m/ i2 {7 i& ~# J maxLength[cur] = 1;& Y2 T: f) L. t9 y9 m
if (!children.containsKey(cur)) {
2 V$ p1 B: S0 U! A return;
) H0 q) a% R- D1 ]( A6 ~ }* F0 m7 Q8 E Q. Q& Y
var curChildren = children.get(cur);
5 }9 e+ v- W9 B int first = 0, second = 0;) N+ u6 ^( E1 f0 I8 m% q
for (int child : curChildren) {
/ F9 g0 {5 o, ?2 r% g dfs(child, children, maxLength, s);+ M! z& S" u I% w# _" Q* t4 M
if (s.charAt(child) != s.charAt(cur)) {/ \ a O# D' i
maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
# G4 Q0 z, x# ^ if (maxLength[child] >= first) {; I1 K- J' T' r$ T* f6 F) u/ B7 q5 R
second = first;6 v0 U; W+ B6 z: L
first = maxLength[child];, d. t( Y/ r. x' U* n9 t
} else if (maxLength[child] > second) {2 Z. J+ _6 Q2 N$ W+ E1 O7 W
second = maxLength[child];0 n v9 Y7 ?. j$ @6 N2 M7 n
}, J) P# t6 h/ B) [( a) S
}8 v% J6 {2 A1 {; r; y" E
}
/ S) c! J# |0 J- r) U+ } res = Math.max(res, maxLength[cur]);
) i6 O' R' @ a0 C) g res = Math.max(res, first + second + 1);! O" c9 h3 r( @2 ~, ~. X+ J
}
4 z8 [# e( j: K7 s f+ { ]. @# v} |