登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 句子中的有效单词数】
. o/ }- l$ n6 m0 O4 B% g6 @: Q8 N. J3 P( t$ y R5 G' N# `3 y
解题思路" k1 ~6 c5 p; t2 G: |
签到题。
! j8 ~0 `! `& U) ~9 p; t5 d2 K
5 W Z, v' I. W代码展示
. E1 X- H* [& D+ ]
, k7 b% l3 c, b) w* v ?3 Qclass Solution {
* w2 @# S- F$ C* Q7 ^ public int countValidWords(String sentence) {: Q8 L! C% l! b; P7 H
String[] words = sentence.split(" ");1 Y% ~7 i9 b" R$ ^% l$ t
int count = 0;
0 U5 W o, d9 |" \/ q6 P for (var word : words) {2 U" u. e, @$ d" b- ^) t
char[] chars = word.trim().toCharArray();4 I9 D4 |- o& N4 v
boolean invalid = false;
) h5 R1 U4 q2 C2 V b) K3 F1 ~ int index = -1;# ^( y& ]4 ^$ Y% q9 B3 @/ y u3 x" H
for (int i = 0; i < chars.length && !invalid; i++) {2 {9 Y) `* J3 c4 j
char c = chars[i];
0 |" Q8 _$ ~6 U) J3 Y if ('0' <= c && c <= '9') {# [4 F) Z9 f; D: w& X5 M, K+ m# e
invalid = true;
G/ }( E0 R7 w- ~! k } else if (c == '-') {
# B( C J& N7 F* J4 q- j0 g if (index == -1) {
/ e! u8 S8 o: d# C% Q3 q index = i;
& E$ c- |. K9 s* { } else {, t" Q, ]5 M3 L8 N" P1 v$ B
invalid = true;
; }0 D, C+ A# T# j; F" s: ] }5 v* k8 T% |; I; \& V. y
} else if (isNotAlpha(c) && i != chars.length - 1) {
3 N/ f) D2 `; o- h" D" R/ U invalid = true;
1 K' h; j& P* J9 l" { }" f4 U( W. f! q8 e' h: ?
}- i) _ P- v! m8 w+ @
if (invalid || index == 0 || index == chars.length - 1) {. f% M& n, h5 F! ]' J! ^
continue;7 y' m/ x+ q" M
}
0 X8 W5 W* c0 h+ x" l if (index > 0 && (isNotAlpha(chars[index - 1]) || isNotAlpha(chars[index + 1]))) {0 o6 }& v \7 c" s
continue;+ O0 X7 P! }8 J7 C
}
" K; I' K5 Z/ p7 m0 E% t) p count++;
) v- K/ Y- ?: A" r4 Z3 z }
( o6 \$ P9 r1 f: M; R$ } return count;
2 X! [0 d% O1 y0 t9 Z! `: |) ` }1 [. ^% i1 E3 S) u2 @. l
9 V; O/ H6 A5 Q$ t boolean isNotAlpha(char c) {' E; R8 ~4 p) q" f
return 'a' > c || c > 'z';& i; e0 B7 w4 i3 _6 q
}
" N. [; H0 L3 c0 ?) u- R
( u6 t. g/ w% ?5 ]; V}4 ^' Y- h# i, r/ m$ Y ^ ]$ E7 q
+ a* }- o* w9 w: U
【 NO.2 下一个更大的数值平衡数】
6 u+ a- ]; n( E( B6 r1 [$ k9 Y
4 I) u$ s2 V$ \5 a) d解题思路5 b! R: L$ w2 @; H' ~
枚举即可。
% f; ?$ _3 G. ^5 m9 d. {$ C
, B7 O6 _0 a' v* R! j1 R0 v" i代码展示: m+ b9 W; i2 g& Z/ ?
# D5 {, t/ V. k8 H5 y: u g8 O
class Solution {
; z, _8 |2 K% e) o; U R5 @ public int nextBeautifulNumber(int n) {
* h/ ^1 _9 K( d, ~3 q for (int i = n + 1; ; i++) {* }6 {. ?2 P$ m. h
if (balance(i)) {
) J, p% }( K' s7 [6 I! i2 u: Q. J# V return i;
6 L7 w6 B+ H0 _" N2 ~6 I }+ s8 K5 y5 W% a5 Y
}/ H, K# R K9 \3 C2 h
}
, d& E' q3 a* c- |, }3 F4 z7 K8 d5 j0 q, P: c, S, L% J m
private boolean balance(int num) {
1 F! @# ?/ A0 L7 E int[] cnt = new int[10];& w6 o+ l1 Y, u7 E+ S" `$ j
for (; num > 0; num /= 10) {
% {9 c, O# c7 T* j w5 { cnt[num % 10]++;
* e* ]1 y2 o+ I) w: r }. D: i) z% o8 R4 t/ ~3 a
for (int i = 0; i < 10; i++) {- X$ U5 Q$ }' `& D1 a5 _
if (cnt[i] != 0 && cnt[i] != i) {
! g4 ?+ H6 k. Z1 M; n( J4 h/ g return false;2 s" ?* P3 V, l1 K$ [# }
}! J% t" d- i$ G$ P' o: d w/ Q M* c6 [
}5 a$ R8 y0 @! y! U( Y) j
return true;
e3 ^% W, x5 Y6 \/ |3 ~9 ] }8 Y0 }1 R( Q7 m
}3 k; C" M7 d$ i' L1 S1 T, p
2 P1 }9 |) t U1 C% J
【 NO.3 统计最高分的节点数目】/ z3 T; {4 q2 b- \/ W% ~# G6 ~- D
: t/ Z! E! x; w5 l( _! O
解题思路
+ X3 n2 |& d/ A% `+ L$ f, s$ l首先进行一次 DFS 求出每个节点的子树大小,然后进行一次 DFS 求出每个节点的分数。
9 r$ B4 s) i8 p U( T* W( c4 G2 g* P# O# v* v8 T
注意计算分数需要用 Long 类型,避免乘法溢出。5 H* e1 V' d, }! g2 |# @
6 l: V g5 |6 T5 m6 |' p# f
代码展示
e. y8 e4 n; e/ E" h+ U, E0 X9 X4 y! W; W7 s
class Solution {' s' l! G; Z0 R. |
Long maxScore;
0 L ], {5 N( F4 g- _ Map<Long, Integer> count;' u) j% M1 s Y/ d# @" s. Q) p
6 p# L6 N& Y" _' H+ a public int countHighestScoreNodes(int[] parents) {
5 V8 }* E D- Y List<List<Integer>> children = new ArrayList<>();7 M. u2 _7 }& u7 I
for (int i = 0; i < parents.length; i++) {3 b; K" I4 p/ j6 |+ T
children.add(new ArrayList<>());7 |: q1 o/ n" y. H$ z
}
8 K' V! i" {0 ~ for (int i = 1; i < parents.length; i++) {1 \- k+ T, N6 b: Z2 t b+ M
children.get(parents[i]).add(i);! O1 x. D% } U3 \, s5 y' C
}
* e/ c, _1 A# l6 l* L5 R0 h int[] sum = new int[parents.length];0 U1 u) q+ j6 `
calcSum(0, sum, children);
( u. Q6 s# Q4 B maxScore = 0L;: }1 e" [% k% B9 y
count = new HashMap<>();
, d" ~# | D8 } calcMaxScore(0, sum, children);' M1 D$ J# C5 J, l9 \- X
return count.get(maxScore);. ~" o- W2 E9 n' z/ o k
}
# S% Y2 o6 z' v0 K- k2 y1 L
6 j9 D* H0 e& U2 X5 @5 f/ { private void calcMaxScore(int cur, int[] sum, List<List<Integer>> children) {
: x5 F6 V$ H# i/ M4 v long score = 1;
% `, ]0 ^, E' x for (var nxt : children.get(cur)) {5 O$ d8 {$ f. {# M2 J( Y: o+ v
score *= sum[nxt];$ s9 y/ s$ m, y% Q% c& s: s/ l% @
}
8 S0 n/ y: E1 N, Z b, y if (sum[0] - sum[cur] > 0) {
* C3 Z+ ?- L* \" U: @ b score *= sum[0] - sum[cur];
c7 Z4 m n' ?( X }
9 Z, S) _4 ?$ g3 T( l( O, J7 ?+ j8 V count.put(score, count.getOrDefault(score, 0) + 1);
. {. A, v" z" X; g- L$ I- `, B maxScore = Math.max(maxScore, score);8 ]0 T5 F3 Z; R5 e
for (var nxt : children.get(cur)) {
9 z( B- D# ?6 j0 Y. l* e calcMaxScore(nxt, sum, children);
- I8 c' @& @. T9 K, a6 h( e }
" k3 V0 }* n9 u3 x" k y/ R }
f6 O& i+ g d* u4 |" e# G( s- W( C+ ]* U8 [' L
private void calcSum(int cur, int[] sum, List<List<Integer>> children) {; E) E" D$ P) A0 ?$ E
sum[cur] = 1;
. |% D- {7 j6 h; r5 U, X for (var nxt : children.get(cur)) {% b$ Z; L0 n. ^3 V
calcSum(nxt, sum, children);
7 e7 X8 |% Q2 E sum[cur] += sum[nxt];
1 X' e r; k* p4 A# A0 E }% r7 ]& L3 f, i, d' C2 M5 |
}
+ g. |9 Q' c0 V' s+ q}# H! Q. K ~* E6 g, ?
6 d. C* }. G6 b! C, V: k B【 NO.4 并行课程 III】* ~1 M a" M3 J/ j( D) u @; m
$ i6 o/ t& q$ n# r
解题思路- p! w/ r( Z# P7 C: K% V& b# @
几乎是树型 DP 模板题,比较简单。令 finish(i) 表示完成课程 i 的最短时间,则 finish(i) = max(finish(j)) + time[i],其中 j 是 i 的前置课程。
, I$ e& c# F/ \6 i( U6 D, I$ b
1 a! M! z: T0 Z$ v5 Q7 H( D G代码展示2 k0 @4 e* O6 a4 h' X
- Y1 n) o4 S7 |6 C: ^; oclass Solution {( i& M7 g. N4 M( F; p" j$ Q" _
public int minimumTime(int n, int[][] relations, int[] time) {
! L" j- \+ m3 o5 o9 J8 H' f, Q List<List<Integer>> prev = new ArrayList<>();
1 r% {3 S, B2 a$ Q; b for (int i = 0; i < n; i++) {* H1 z5 v# R- e0 T' P: [
prev.add(new ArrayList<>());' p; @5 K* x+ N' V5 g. N/ l
}$ M( k2 A9 n: n8 R8 L
for (int[] rel : relations) {3 H5 x2 s& P8 z2 i m: [! n
prev.get(rel[1] - 1).add(rel[0] - 1);
3 h( ]- x2 l6 |1 p5 }. v, P }
# Q! I0 G# Q3 R7 m int[] mem = new int[n];
3 m o& o. q8 P+ H. ?4 _ int result = 0;. o' R+ E& u/ K
for (int i = 0; i < n; i++) {! O1 D+ \5 z- u" H
result = Math.max(result, finish(i, prev, time, mem));2 A5 k% `3 z z! L2 v+ G
}
% |- _. D% r$ V. A# A return result;% \; L% u |" R, F( {( Y; \ E
}# {1 m" q* K6 W& ?+ k8 Z
5 F# M B3 l" U9 z
private int finish(int cur, List<List<Integer>> prev, int[] time, int[] mem) {
1 `! X2 ]6 U4 C. A+ P5 T O2 L if (mem[cur] > 0) {, S5 |0 O7 m. p$ w' ?$ ^) I' q
return mem[cur];- N- b+ E, v* ]- B# J$ z( u2 x- u
}
9 K8 y$ _; {8 v. d) z if (prev.get(cur).size() == 0) {, F+ m* j! ~; d; t @' }2 {+ ?1 Y
return time[cur];, U# j: k: X8 W5 i) V' z
}1 K! \0 o0 h6 v- Y# q
for (int p : prev.get(cur)) {: x6 r, Q* L! t+ F/ M6 _8 M
mem[cur] = Math.max(mem[cur], finish(p, prev, time, mem) + time[cur]);
/ Z7 ?7 c2 E6 @- q6 y }: p) y! T% o8 g
return mem[cur];. ?; J4 B" g% s! j! j, j
}5 x8 [" N- H1 T# v/ F- e
} |