登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 句子中的有效单词数】2 {" A r/ w5 w( j, B" U8 Q
$ U2 t' t6 Z6 w5 n解题思路" ]# [6 M u! u& F1 p% u8 c
签到题。) G+ @8 c5 H5 c, B. l$ G6 `& ^9 X: S! z
+ q& t, S. j8 d* ]1 C8 `4 d代码展示7 ^ `( l+ X) r
+ \- q+ q S! x5 jclass Solution {
% o4 E/ d& k s3 h& l public int countValidWords(String sentence) {" b/ P Y+ b$ y- y
String[] words = sentence.split(" ");
# q+ Q; w4 x8 T f9 R3 E0 ^ int count = 0;8 i6 ~" g+ `& t- Z* y, j
for (var word : words) {
% O" l8 j! k+ Q) X: U char[] chars = word.trim().toCharArray();
2 a$ d" \% t% f/ f, ]& Q! v boolean invalid = false;: a8 c* V- N8 o) v$ U+ e
int index = -1;4 d2 L! w/ `7 ~# ?# R' ~
for (int i = 0; i < chars.length && !invalid; i++) {
9 c& j$ ?+ j0 }# |/ r, ]/ i' m char c = chars[i]; _7 R9 x1 R, I
if ('0' <= c && c <= '9') {
% X9 I: c, D8 j- d invalid = true;, J9 U( R4 ^1 T! y
} else if (c == '-') {
6 Z @1 \" W( U& {) `' z7 q' v if (index == -1) {9 j9 s% D! v; _& b3 L
index = i;
7 m! K: }8 B5 W, I- R3 Y } else {. T2 A% B/ s- A# q. i y
invalid = true;( _* L& f8 E* \6 y. p6 B2 V- O
}8 [4 r0 E; {/ D& a" U8 W
} else if (isNotAlpha(c) && i != chars.length - 1) {
- L4 T* i+ m. ?% ?9 D' Q+ ?! j) Q invalid = true;0 p# V; ~9 z1 }8 g/ E: `
}
6 ^) A! T; f* [ k: P7 L( E+ X }! `* ?, K2 i/ M* A3 L+ a
if (invalid || index == 0 || index == chars.length - 1) {; z0 D: Q' o8 O6 e; u
continue;
, W# {8 E' h' Q$ w% S1 `; p }6 F5 @$ I1 K4 C: E# M
if (index > 0 && (isNotAlpha(chars[index - 1]) || isNotAlpha(chars[index + 1]))) {
' g8 q* J6 P* Q8 ^ continue;
+ f0 N5 V# n/ r8 B4 [2 | }* q' e0 D% D) B8 U+ P$ K& G" o
count++;
1 x! d5 `* _1 x, D2 m# K. o }
* ]) j( b$ ~0 D, [! b return count;
) @8 c" W) \" o# D0 R; A$ e }* K- z0 ^0 ?: s4 Z. z: j
; H8 p3 C$ G- d C+ W. Z boolean isNotAlpha(char c) {
9 p w) c7 I; L) ?# O9 ]/ W9 ^ return 'a' > c || c > 'z';% z8 h1 l# c8 c& B1 j7 d0 W' |
} K, f; G |( c6 {' `
. ]0 A- H2 N) n5 A; G/ E( c
}
5 k% c. W. q3 ~5 ^/ u
% y( c" ]: j( I8 Z【 NO.2 下一个更大的数值平衡数】) l) J# `, q4 Y5 h/ L, x
1 L4 `0 [# V9 O( a' Z1 C4 c解题思路
% @" q3 w3 ?4 g! t9 J枚举即可。
6 Y4 }1 p6 A4 J, O ~) ~$ ~7 Q1 X5 L% G7 `$ y% t
代码展示
% m1 ^$ k$ s( n4 b, J7 {- A) a
: r( r: D: `) c& _! Gclass Solution {6 p5 }2 ]% T: y1 Y l2 E
public int nextBeautifulNumber(int n) {
! N* c; z# o; m) Q( S% \9 V for (int i = n + 1; ; i++) { r \$ x+ N% X, G
if (balance(i)) {% L2 g9 `( x2 b" L1 m/ ]
return i;
7 `8 N- Q! _9 f) T& F/ m }
* j1 u6 v( Y) Z) V5 Z }
4 S* h( _9 w% e+ p! D& Z }' O1 d' F7 P2 v o* g: D
0 K0 X9 J% P% s* C- ~+ { private boolean balance(int num) {8 I7 s r( R. R2 }9 z' h
int[] cnt = new int[10];
8 k# h+ @9 j0 J x4 A for (; num > 0; num /= 10) {$ n4 b. H# p; H- c7 Y' S
cnt[num % 10]++; R' [ T( |! f6 |! q+ A
}! u4 C ?2 i* G! G$ O/ I3 J
for (int i = 0; i < 10; i++) {
' F5 B$ C2 S, h! t# D" T6 [& l if (cnt[i] != 0 && cnt[i] != i) {2 u; K# V% ^9 {/ u# Z
return false;
% r q( Z6 o4 C% N }
# k% H4 V: S( i: r+ ? }
) {, A5 S5 f K return true;
% F% ~1 b0 O/ F. D+ |5 n5 L }5 [: }, `- C# e$ M8 q
}; r2 v9 Q) w) S" w- u. G* t9 T
; [8 ? }) l0 q5 |2 S: [9 d2 t
【 NO.3 统计最高分的节点数目】
: H7 u( c6 \; ~9 I9 J( R* J
% ?( W6 {8 B$ U0 r+ G解题思路
! c3 b+ y, C' p3 J5 a6 m首先进行一次 DFS 求出每个节点的子树大小,然后进行一次 DFS 求出每个节点的分数。6 N* c+ B) I3 n% F) m* X& A* C
3 T% N2 o( S6 G p% {0 t注意计算分数需要用 Long 类型,避免乘法溢出。) U ]4 B/ V; z, `5 w5 Q
" C1 j% [6 Z* l! G R0 P6 G3 _代码展示% M' ~9 E# X" c1 s# s' o0 p( K7 Y) V
2 f( t$ k- ^2 B5 ^% zclass Solution {
6 l1 |) f% O- }' O# \ Long maxScore;
1 y. X {* M: f& u& r Map<Long, Integer> count;
1 p5 M3 J+ o6 p. i: g7 L/ k4 x
7 n, K3 D3 v$ y# w( P" ^ public int countHighestScoreNodes(int[] parents) {
. R& W; o" Z, Q2 z List<List<Integer>> children = new ArrayList<>();
" ^' [1 K9 G2 H% T; b9 W8 z2 u for (int i = 0; i < parents.length; i++) {. m, I; K, y3 l3 `9 ?
children.add(new ArrayList<>());
/ p9 h8 S* {2 A, @3 r }8 a) f }0 l' ~5 t9 R/ C5 Z" w* i$ m
for (int i = 1; i < parents.length; i++) {6 I6 d! b0 |( X; G; l
children.get(parents[i]).add(i);: w4 ~& O+ ]: {+ x% k+ K
}
L, m1 ?2 a, l1 e5 G) W! \8 L int[] sum = new int[parents.length]; {4 J& m- g$ t
calcSum(0, sum, children);: J5 B0 Y( P% e7 O& m4 |
maxScore = 0L;
& i( [, t- {+ D) M count = new HashMap<>();
+ ?, X2 e9 e% C' ~- f- f$ r" q. P calcMaxScore(0, sum, children);
0 X8 ?# k- S) I5 o" N# y return count.get(maxScore);. L! I% Q# k; z. {! K
}
3 s4 C( v0 p- J# ]3 E1 F! o) l2 N1 u* c2 [" p7 I
private void calcMaxScore(int cur, int[] sum, List<List<Integer>> children) {+ _! g! r( n# [) K
long score = 1;
! c. f6 t4 r8 ]1 X for (var nxt : children.get(cur)) {2 G; o( ?; t; a1 [
score *= sum[nxt]; h. m8 o" C8 b/ S
}& N1 m# o8 @$ @) @9 Z, q
if (sum[0] - sum[cur] > 0) {
* d2 g, b. ^6 Y! n! K& N- t8 [ score *= sum[0] - sum[cur];
" J: V" M( X% t% \ }4 ~+ f3 i0 t/ k1 E2 ~+ T
count.put(score, count.getOrDefault(score, 0) + 1); m q; `1 ^) y+ |3 F& k0 |/ E* F5 D E
maxScore = Math.max(maxScore, score);2 X4 e$ k9 i* [* F; z4 w6 b1 L
for (var nxt : children.get(cur)) {3 C$ t! T4 X5 c. Y0 w" b
calcMaxScore(nxt, sum, children);. \4 {3 J+ r$ J, C
}1 [% O: }- J- l& U
}
" u1 h) P1 U2 R w' i& |) ?8 ?' l8 Y
private void calcSum(int cur, int[] sum, List<List<Integer>> children) {
+ x: C& u6 f( v# h$ f( J sum[cur] = 1;
# U- L+ W C9 X for (var nxt : children.get(cur)) {
( C+ b& W: r r calcSum(nxt, sum, children);% g3 V! z7 V+ T3 l) e
sum[cur] += sum[nxt];
" [( c2 O) w* R. k" d }
% C5 Z8 F, B0 O }+ o+ R6 T& _% p9 r& b# z' A
}
+ R4 e, T, M* s$ O
; ?6 S& q; G; j【 NO.4 并行课程 III】
2 z, `! N! ^# {# D
) Q7 o. P4 C8 V& v% f解题思路- Y/ E3 k/ ~9 F$ C4 O) e
几乎是树型 DP 模板题,比较简单。令 finish(i) 表示完成课程 i 的最短时间,则 finish(i) = max(finish(j)) + time[i],其中 j 是 i 的前置课程。7 V) C( N( l% t0 u1 \
5 V. g1 u B' D5 R代码展示6 a: S6 T; h5 }: d% D$ |
1 _/ L# b4 }7 g; b4 T; J" aclass Solution {
; ]4 b# B1 m5 g6 L public int minimumTime(int n, int[][] relations, int[] time) {4 u# g( j5 L. |. f
List<List<Integer>> prev = new ArrayList<>();
: J: n; X+ M' A' Z, \8 Y1 I for (int i = 0; i < n; i++) {, ~( S8 L! }; x# y$ h
prev.add(new ArrayList<>());
4 |( `+ { T7 n+ a2 \ }
0 [' j6 [: @1 s$ C9 M for (int[] rel : relations) {0 v7 K. m# m0 G0 P
prev.get(rel[1] - 1).add(rel[0] - 1);! b. o1 k/ v: B- P" L* Q
}
5 z% ^( i$ m* t; ]( w int[] mem = new int[n];. Y+ Q$ ^; w# X- n
int result = 0;( w6 t4 K: e p7 `; R1 n
for (int i = 0; i < n; i++) {0 R) o2 u' U3 ^' d- R
result = Math.max(result, finish(i, prev, time, mem));. O& P4 b6 u0 ^: P* B4 |/ X
}* ?* s% ^' ?- l; w# w
return result;
$ J6 X! ]% H& o1 b( D5 y" A& T' M }' a( R+ X. X3 e* A$ E
' B$ P" R1 U# T+ M1 J8 g
private int finish(int cur, List<List<Integer>> prev, int[] time, int[] mem) {
& m( N' p' Y$ H: @9 k' P9 n# T' K if (mem[cur] > 0) {( f& y+ W0 t$ `% K8 B/ S
return mem[cur];; q8 S2 E, F% j2 c" j& w3 Y
}
; y" f; }1 s- p! `1 V8 \' B if (prev.get(cur).size() == 0) {; _* t: ^/ l* H/ f3 p }
return time[cur];
6 ^9 b1 g5 v+ V }! k1 @3 c; b5 _! v
for (int p : prev.get(cur)) {( I" N! E+ B4 i% O# l3 U
mem[cur] = Math.max(mem[cur], finish(p, prev, time, mem) + time[cur]);
. ^3 u7 q; ?) J. F7 P }+ h2 ^" C" H6 \# y5 B
return mem[cur];0 e& J3 B. v. M3 h& _3 q. r8 ^
}
p: d% U/ M/ C: ^, n% M; N, _+ j} |