登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 计算字符串的数字和】7 c* `0 Q9 D" A5 B* ^
6 g; T/ T K2 `4 {! P+ B
解题思路+ R" G2 d) S. Z$ a7 n& z) a2 I
签到题,循环处理即可。
' t w# p K+ ]* C9 ?7 {: p
: I8 M7 |& L% Z4 s代码展示
. o7 t+ \- f3 Q* r
# O1 q- z/ R; X% P# P- v$ I) dclass Solution {
6 `' t, c- @! w" W, u9 o1 ^ public String digitSum(String s, int k) {* {: u2 [' Z+ v+ \- g
while (s.length() > k) {
/ C2 j: n. f9 q$ A1 ~1 s9 z( a/ n1 c" q StringBuilder builder = new StringBuilder();
+ K1 X" s A) E0 @5 M* D for (int i = 0; i < s.length(); i += k) {' l( A/ f, P8 @( i* c/ u2 }5 V. g% a# V
int sum = 0;0 ^! @ }6 L! U# H6 ~& m4 v
for (int j = i; j < i + k && j < s.length(); j++) {( M( h2 m% X) J. S [. h
sum += s.charAt(j) - '0';# g0 M. l6 Z7 D% X) q, ~
}
( y8 V1 u; ^+ H+ K1 h5 L% M7 J! { builder.append(sum);
8 g7 @7 X- l" p. q v9 D' V. W }$ D- N# Q" L, U" u$ X- H2 `
s = builder.toString();
& g8 n# I/ A6 c/ u }; u2 z1 {9 k5 b! e$ L& {0 g
return s;" {: {2 K$ C- W2 A2 y+ K) L# j! i
}
: S3 x+ n- n& j+ H/ v* L5 Z}
- B2 O8 R, E& ?: F
6 U2 K; ~6 H! ]
5 k$ B0 a: b. I9 K8 h1 u【 NO.2 完成所有任务需要的最少轮数】! J$ a) {5 H3 F3 l( n, ~" ^
, {8 n, ^. u) r6 E' Q3 W# V2 @5 R解题思路
' w4 k; a& A" a使用 Map 维护每种任务的数量,然后使用 dp 求解。
6 \0 ?. u2 } \ }" Z+ F% N D: i5 K! `7 R5 \
dp[i] 表示完成 i 个任务完成所需的最少轮数,于是有 dp[i] = min(dp[i-2], dp[i-3]) + 1。
& _* G3 D1 m% _: E6 n1 o1 D/ h; }$ N6 e0 g$ F
代码展示
# g+ p" |4 k" _- j% d* T" f5 |% B1 ]7 B
class Solution { a$ H% ~7 r3 Y
public int minimumRounds(int[] tasks) {% B. O8 o6 V+ X/ k; \
Map<Integer, Integer> count = new HashMap<>();
, M) Q6 g( E% Q/ {8 r for (int task : tasks) {3 k4 _5 G$ P: S$ y' a# N$ C5 p4 L& U
count.put(task, count.getOrDefault(task, 0) + 1);8 P/ P- J5 X3 i' ?* n0 [
}5 w6 r+ H3 l1 M" C: I
int res = 0; s# ^- ~; x( H% Z- [
int[] mem = new int[100001];
( a# U& t' y- |4 M) \5 @ mem[2] = mem[3] = 1;3 p2 W% W% @8 s, w( T
mem[4] = mem[5] = 2; k+ r \; R9 X" D6 p7 D
for (var entry : count.entrySet()) {4 J' ?: t7 n- i. |: Z2 P3 V) L7 B
int cnt = entry.getValue();
9 d2 F2 b0 u/ Y, [- h if (cnt == 1) {
7 f; ?$ g: z3 Z2 \. `3 e N% F" v return -1;# ` z9 N2 I3 D% d4 @- b3 Z. W
}
" |7 s- W5 y5 m; E' _0 C% l res += dp(cnt, mem);
7 x. u* `1 |) Q) ?# a/ D7 U }
# ` {9 [. q; D; f return res;& U: p4 J6 s9 o
}
: v' P; H0 e& c4 d: b- w/ x
1 A) b7 H4 i7 I( m6 ?7 { private int dp(int cnt, int[] mem) {
% D8 o) X+ H9 M/ {# U" ~/ S6 { if (mem[cnt] > 0) {' Z2 A7 P4 k' Y6 w/ W* e2 ~+ R4 S
return mem[cnt];7 j; w2 J0 H" m( o7 l H2 M
}+ S4 }, f" A7 G* `* h( \ l! [
mem[cnt] = Math.min(dp(cnt - 3, mem) + 1, dp(cnt - 2, mem) + 1);
& w0 z) K1 Y' o3 n2 Z' E return mem[cnt];" x1 C# v! ]3 P8 ~# v0 I2 Q) }
}* K4 d% ]9 _7 |) p7 o+ ?- ~: M7 E- O
}( v) x8 A9 G- }- H" \
' k/ ~" u: N- r
/ g8 ?9 s3 d! K! U# }
【 NO.3 转角路径的乘积中最多能有几个尾随零】
4 F5 I; M% K7 |- u Y" C$ c. l! y6 A: U
解题思路
9 o$ V! a9 h1 C. X! p, s尾随 0 的个数其实就是 MIN(因数 2 的个数, 因数 5 的个数)/ k6 l; r; ?' ?3 Z- l/ Y
1 W5 Q; h: n2 p代码虽然很长,但大部分是重复的逻辑,详见注释。
5 K' J$ a+ l2 d7 \! H3 W# V: O$ f( |* ^9 o
代码展示; E& y7 Q* |/ h
+ j. ^% T. D6 P" c( y
class Solution {
! x4 E: K" s5 {6 e( z/ t public int maxTrailingZeros(int[][] grid) {
3 S' _6 }2 A6 b // up2 表示 grid[i][j] 开始连续往上走最多能累计到因数 2 的个数6 R* L v& A* Y" L0 e$ I$ c. G
// up5 表示 grid[i][j] 开始连续往上走最多能累计到因数 5 的个数5 T0 [+ L. Y7 ?, z' K
int[][] up2 = new int[grid.length][grid[0].length];# s" L1 F8 n" A/ C1 T: E
int[][] up5 = new int[grid.length][grid[0].length];/ y4 t( [/ ]1 c3 @
for (int i = 0; i < grid.length; i++) {
( Z1 R! d" T+ E) ~ for (int j = 0; j < grid[0].length; j++) {
. {4 H1 P! M! L up2[i][j] = num(grid[i][j], 2);
7 [4 R; k7 T! @1 y up5[i][j] = num(grid[i][j], 5);
; w, |) \" B* |% A0 i% y3 o' | if (i > 0) {0 a. ?! {2 M2 L' L" l" G
up2[i][j] += up2[i - 1][j];: p2 T& j# {% \7 {
up5[i][j] += up5[i - 1][j];6 g& j, A- j5 y3 E" j
}" _' P7 I) ]7 h% `
}! j/ X& i( t! |2 [
}. T1 V; B# Z! G1 m) q
// left2 表示 grid[i][j] 开始连续往左走最多能累计到因数 2 的个数4 i4 c5 z4 Q) a: a6 ~0 T9 [3 S0 G
// left5 表示 grid[i][j] 开始连续往左走最多能累计到因数 5 的个数
3 z/ s: o, H& u4 N" o int[][] left2 = new int[grid.length][grid[0].length];/ S: K: Q2 h- j: ^ q5 L
int[][] left5 = new int[grid.length][grid[0].length];5 ~2 b6 J7 L! H2 f
for (int i = 0; i < grid.length; i++) {
1 I/ I, I0 R0 B J for (int j = 0; j < grid[0].length; j++) {
1 I. U5 _& E7 n1 P( C% m left2[i][j] = num(grid[i][j], 2);; {( c5 b: i0 y% G. m9 D
left5[i][j] = num(grid[i][j], 5);
* C3 N' e2 \2 v2 _' A; P% B if (j > 0) {
r4 p2 E7 R8 J+ C3 B n/ s left2[i][j] += left2[i][j - 1];
- U! ?" i7 e& L& N3 R% k left5[i][j] += left5[i][j - 1];/ H8 v" p e9 S* }3 u# g5 I
}% g- E3 g0 d8 |9 ~
}4 Y! Y( h9 S' ]- p9 G
}
. p& [& j) e8 c5 u/ f6 {& o$ j // down2 表示 grid[i][j] 开始连续往下走最多能累计到因数 2 的个数
& K2 C( O# [# G$ q/ g3 J* T // down5 表示 grid[i][j] 开始连续往下走最多能累计到因数 5 的个数
$ j7 g5 u2 R F: `% m0 p int[][] down2 = new int[grid.length][grid[0].length];8 n0 A1 ]6 _& I
int[][] down5 = new int[grid.length][grid[0].length];7 m2 T: h' d. [% K
for (int i = grid.length - 1; i >= 0; i--) {
! G$ b% o3 O) P( j' k H! \ for (int j = grid[0].length - 1; j >= 0; j--) {
0 W: F8 \1 Q5 p down2[i][j] = num(grid[i][j], 2);
; ?; ~/ v9 j/ J) `5 f down5[i][j] = num(grid[i][j], 5);
' M# C: r$ C, R if (i < grid.length - 1) {
, n2 L. [$ w2 N9 V6 A down2[i][j] += down2[i + 1][j];
- C* V0 _" X. h' b0 v down5[i][j] += down5[i + 1][j];
3 E. _6 v b* @ }3 m: S1 k' c' K! e9 {: ]
}/ }, q _" D) P2 ?- f' F
}( e* j' J& }# h. w1 }6 W; j$ y1 l
// right2 表示 grid[i][j] 开始连续往右走最多能累计到因数 2 的个数. |$ m) g3 ^# Z+ D
// right5 表示 grid[i][j] 开始连续往右走最多能累计到因数 5 的个数/ s, Y Q% X# A
int[][] right2 = new int[grid.length][grid[0].length];
( ^/ r! e7 t2 Q5 D int[][] right5 = new int[grid.length][grid[0].length];
4 G7 H( L# {( D9 q' l2 | for (int i = grid.length - 1; i >= 0; i--) {& Z# O S* k* }1 r8 d& ^
for (int j = grid[0].length - 1; j >= 0; j--) {; @4 H. x( `$ Y: }* C; I' h1 ^
right2[i][j] = num(grid[i][j], 2);- j6 U7 j3 i1 D0 U# u
right5[i][j] = num(grid[i][j], 5);
! z# ^. p+ X* L6 J* t5 v) C# {0 o if (j < grid[0].length - 1) {
1 O6 F6 Z- b! o. O right2[i][j] += right2[i][j + 1];9 R- U% S' d! P! y% o, p0 s) X
right5[i][j] += right5[i][j + 1];% y# C' M: o3 z& |0 b
}4 w/ C# E5 d1 j. Y- N% F
} V- K& V. U7 n+ v* n3 E" Z: y
}
& v# q; b7 n+ g: Z# ]6 {4 {5 T2 @- r% r- s5 f8 K) |) j( C
int res = 0;* R: S, z0 F% ]% Q [5 ~( m$ d' T) k
for (int i = 0; i < grid.length; i++) { n: K2 G9 [& E) I& q2 z
for (int j = 0; j < grid[0].length; j++) {/ o C1 C" J6 y
// 有四种转角形态
- L% `1 v1 X7 C3 Q1 R$ u // 1. up + left, |# K7 t, P3 E4 `* {% Y3 F
if (i > 0) {
7 v$ i x* f/ o. _1 W$ Y- x res = Math.max(res, Math.min(up2[i - 1][j] + left2[i][j], up5[i - 1][j] + left5[i][j]));
( e% H! @; X# I: r8 Q$ _2 Q2 t }
8 k% b0 o4 r$ h/ s4 t; k // 2. up + right
0 U( X! Q6 y' z if (i > 0) {+ U, s' D9 Z S
res = Math.max(res, Math.min(up2[i - 1][j] + right2[i][j], up5[i - 1][j] + right5[i][j]));) R4 @, y3 h( z3 {6 T! \' ~6 B
}
6 H9 ]' o. t- X9 S- P // 3. down + left/ @) C3 c( m4 Q8 [- E/ E) N
if (i < grid.length - 1) {% |0 a, y x! n- F6 D" }
res = Math.max(res, Math.min(down2[i + 1][j] + left2[i][j], down5[i + 1][j] + left5[i][j]));/ a7 y9 x, p" I( E4 G1 W9 g; s% R
}
! b+ l4 T9 O" Z) [4 h; p+ J) i1 m // 4. down + right
1 l/ y! d. b1 X2 ^ if (i < grid.length - 1) {+ K3 j3 Z D6 `4 y3 i3 W( m7 x$ a
res = Math.max(res, Math.min(down2[i + 1][j] + right2[i][j], down5[i + 1][j] + right5[i][j]));
7 ~$ y) I$ g" v+ V. v }
* {+ }+ Z0 n. c z# C // 不转角
/ B' C( w( \; s+ B+ Y7 k5 g // 5. up/down/left/right
' T" E, ~7 M8 Y i7 B! u/ S8 Y res = Math.max(res, Math.min(up2[i][j], up5[i][j]));
; i' F$ ]9 v6 ]* N1 p res = Math.max(res, Math.min(down2[i][j], down5[i][j]));
1 K1 L% A1 ]. J' H. s& Y2 `$ W, } res = Math.max(res, Math.min(left2[i][j], left5[i][j]));& P5 V& P& q6 @/ E
res = Math.max(res, Math.min(right2[i][j], right5[i][j]));& d# N$ b4 j/ j. n, L. ^0 m
}
& b A Q4 C) s* G* ]3 S }9 J! E, X7 L- K! Q( h. [7 |" @
return res;
z" a) l; n- e. ` }
& i& m3 g8 b( l1 z
; z3 N9 i" a- a @" b private int num(int x, int y) {
! C8 R: G" x! w0 B/ ~ h; B5 v1 Z ~ int res = 0;
6 b! B( U* O* o" t' X4 X9 G while (x % y == 0) {# f$ V* r j* t7 {
res++;
. B, q b5 n& G2 F: d x /= y;
) G6 M3 {$ U# i# Z1 m }
8 V2 K' E( I4 b6 v [ return res;
' t; Z8 H6 }8 x5 T2 ^( F }8 S" n4 i$ n* H0 h% \( U
}
5 S1 K$ M: o9 u) A, M \9 ^5 ~. E; [3 Z# ?9 S( Q k
【 NO.4 相邻字符不同的最长路径】
5 X. f0 c7 g6 l3 g6 E) }7 n0 c. |. L" y) P* e* P/ h" W! O8 @( Q
解题思路9 S* ^5 s6 `7 H2 h0 [0 T+ i
求出每个节点向下走能得到的最长路径,在每个节点的所有子节点中,挑出最长的和次长的连接,可以得到经过当前节点的最长路径。
; A: G( ?2 `( f$ l1 t3 _: n# V% @: D9 e- r! D1 V- E8 S7 X# G0 g* p
代码展示
; R$ E: d6 k: G7 q% Y
& g: W/ g8 Z+ o" a: vclass Solution {
& X6 k4 z: U" y' B9 i0 o int res;
4 {7 `' ~, M+ c; ^+ D6 z" W$ ]: ~! I% s) M, |( ~3 g
public int longestPath(int[] parent, String s) {4 X0 w0 Q# k9 {+ ]2 @+ L# U
Map<Integer, List<Integer>> children = new HashMap<>();) ^; g# ~+ [9 S5 R% z3 y" j' H, L
for (int i = 0; i < parent.length; i++) {
! X2 O& ~6 |- m" z& w. E9 e. i1 U! | if (parent[i] != -1) {8 d- @( S, U! u! y1 [
if (!children.containsKey(parent[i])) {
, H7 y9 P- B4 e+ r( L children.put(parent[i], new ArrayList<>());1 }7 N: G6 V X8 o
}
5 r* A3 }$ c$ a# t+ {7 a' G& O children.get(parent[i]).add(i);
- O' t( Y- f8 R6 G' ? }
7 @& x6 Q) p; k" Q" d/ ` }4 \- V9 p* a; p
( u0 e7 J) o9 B# Y. _+ P# L( J
int[] maxLength = new int[parent.length];) F+ c/ b4 Y# @. ?
res = 1;
- ^4 Y# H/ R. | dfs(0, children, maxLength, s);
4 k2 Y n' W t2 c" B return res;
' o5 p# N o; C3 [& M }7 E7 r% ~/ f4 d
. }# H% U2 I5 t+ r private void dfs(int cur, Map<Integer, List<Integer>> children, int[] maxLength, String s) {
+ d; r( }; k' t. O maxLength[cur] = 1;% Y/ e& M1 q4 U; Q, B. c6 d
if (!children.containsKey(cur)) {
& o& G8 F- h" O( ], A" o return;
( t, b f& n( J$ e- g- q }; b- o( T; z0 p1 d4 O3 |1 x
var curChildren = children.get(cur);
( K9 U Z! }& q int first = 0, second = 0;0 Z8 c; O' }9 A5 g
for (int child : curChildren) {0 q% H, @8 J: E; ~ r4 q' s! ]
dfs(child, children, maxLength, s);
) X5 w7 E- P3 p: S7 t% i if (s.charAt(child) != s.charAt(cur)) {' S" x; y& d# D8 i* b" S6 I
maxLength[cur] = Math.max(maxLength[cur], maxLength[child] + 1);
% Y g, r7 w" g- {- i- g# D0 ` if (maxLength[child] >= first) {+ r" `2 b" Z* [5 g+ I' G# H
second = first;& K z- `, Y# X1 W4 b0 C
first = maxLength[child];
' W" P a" O; q" |/ ?! ]* L) p } else if (maxLength[child] > second) {, {2 u5 o+ V" ~
second = maxLength[child];2 N2 G+ |5 X4 x% s& i
}
+ S- g8 Y& Z; \. U8 Y }
I9 N8 D% j) M6 P( r }6 W- l4 y# v" A# d, |# d7 v1 t
res = Math.max(res, maxLength[cur]);: i# U+ b" O' h/ i4 T( Y) j; h
res = Math.max(res, first + second + 1);
* m1 s( w3 d' A1 S/ [ }9 t# a, K1 `$ {5 _
} |