登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 句子中的有效单词数】
" d8 e2 n `1 K0 Q3 l" {! @8 r
2 V, [/ d- ?$ W9 q# ^解题思路
$ [) ^2 A2 n4 W* Z, u- x签到题。
; S) c* M# c. p$ |& v& l- C0 J, A
+ @ w4 z! v- ]9 [8 z% ]1 s: t代码展示( l9 b) ^# w+ W7 [
/ W# Y3 Q7 J9 v0 _ k) Kclass Solution {: b9 Q# D( d9 M8 R7 I O d
public int countValidWords(String sentence) {8 p4 Y. y" H( }4 A0 O. a; S
String[] words = sentence.split(" ");
: S: v0 l% U4 x9 X3 ?+ j int count = 0;& g% a, R9 n# [5 A
for (var word : words) {
+ B" R. M! \# W' ^ char[] chars = word.trim().toCharArray();
! c, D$ V! ?' S7 [ boolean invalid = false;# Q1 g! ^5 v; b
int index = -1;$ p2 [9 o4 X$ z) f/ p+ J6 }( k/ c
for (int i = 0; i < chars.length && !invalid; i++) {
& x* z& u @: T T char c = chars[i];$ s- k- |% X$ A( i# N ^
if ('0' <= c && c <= '9') {
3 o& s v) v: f; D9 s- c0 P- L- u invalid = true;
) K9 Z$ W9 J& U8 }# H" P9 V* G0 |, M } else if (c == '-') {
6 p! ]% E6 K' u0 j if (index == -1) {; x1 ?4 W# V. [
index = i;
# y) _5 S# |, V9 ?: o+ Y } else {
" ?% j8 K2 Z8 F# j invalid = true;
: s& s+ c$ L% M' ^9 j8 D }- L0 L( }/ z1 }) h. Z
} else if (isNotAlpha(c) && i != chars.length - 1) {7 g2 c6 T7 O, P. A
invalid = true;
7 ~0 r' s/ a- o2 S }2 E# c n" R& w# S/ k1 m8 _' C
}
V6 `) ]6 F9 D7 K' t if (invalid || index == 0 || index == chars.length - 1) {$ d$ C# l8 F* D5 N: _8 g0 d
continue;% @9 M: @& \& U; J0 j, x0 G- \! g- ]
}
. p6 Y: F5 D7 o; @9 G if (index > 0 && (isNotAlpha(chars[index - 1]) || isNotAlpha(chars[index + 1]))) {
k* {$ A7 q) ^& ] continue;
, a3 ~9 C$ k, X5 |* r }" b5 }) ^: c2 l& M! h
count++;
" a% k3 j; O2 E }
; g: F6 r% i% w4 R. f; a return count;0 I; v+ t* E! C8 Y; ^' n
}9 W+ J) h" |/ }
' A: G: B6 ^' Z boolean isNotAlpha(char c) {. b0 R3 r; h6 _7 f
return 'a' > c || c > 'z';
$ \0 X V, a# Y F }5 {$ d Y! j& r* J+ b+ v
S4 X. }# Y! h# z- B
}; u* {* ^3 e! R5 z6 W
6 F! g3 I* P6 d" s7 [% P k2 |【 NO.2 下一个更大的数值平衡数】. S- u% W0 [3 ?5 L9 V8 u
/ z; x w: N+ Q4 h解题思路1 @8 A; I! q; v J6 Q h. |
枚举即可。
$ y, K) d$ @) M4 x2 F4 z; E! c w3 r# q" [1 M l+ T% |
代码展示: z* y0 x8 E; F$ m4 h* i: x
4 v' j+ ], r+ n ~7 hclass Solution {, P5 V. a5 f# y m
public int nextBeautifulNumber(int n) { @3 ]' o) a/ l4 C' L# m4 H. [
for (int i = n + 1; ; i++) {
' ^& R1 ~1 F0 X2 O. l; w if (balance(i)) {$ c/ F, }0 w0 H# \) x( A# I
return i;( Q, W- l; {5 s! c
}5 K8 `# B% t: |6 |* G1 U
}
! v* S5 j. w5 K# { }0 u) {$ ~# X. Q/ {, y
% K. t' \8 `4 |5 Z/ t$ z" Q. m private boolean balance(int num) {0 U8 j: U8 @, Z7 Q: r
int[] cnt = new int[10];2 b4 E% H7 C7 T" A3 \+ h6 V
for (; num > 0; num /= 10) {
- A, V% a8 R+ @5 p" L! _+ w" Q% @ cnt[num % 10]++;
6 g1 e# E6 o1 @4 Y$ i2 U }0 x4 ?. d! t. \: V/ x3 i
for (int i = 0; i < 10; i++) {
. `% Y" U' M- |4 d1 }3 Y if (cnt[i] != 0 && cnt[i] != i) {
c& i7 E8 ]) ~2 x1 z: |6 ^8 S return false;3 p. ^9 O6 U: L( {( V6 ?5 ~1 N& f
}& L8 {7 S3 l8 o7 _2 [" A
}4 @8 Q; X, A: f0 H7 y
return true;
3 F5 P9 P- s, U2 f$ r* n }+ L" ?$ S/ H" S1 A# F: F
}
3 {% w$ o. e- \1 q0 z* |4 N
8 m/ J4 ^2 M% ^, ^* n【 NO.3 统计最高分的节点数目】
0 w/ H1 g5 _, G: V9 {' t! i9 Y# c* G. T4 w
解题思路
" D* P0 t) h4 S$ J! ~2 i首先进行一次 DFS 求出每个节点的子树大小,然后进行一次 DFS 求出每个节点的分数。
' t7 z! a$ t* v- m9 V$ Y* S4 ?& t, t m7 D4 ^; z$ v: t& r# k, W* F1 `
注意计算分数需要用 Long 类型,避免乘法溢出。' g2 N/ G0 i6 t; f& E
' p) L8 N2 C1 t% Z7 L
代码展示
- U# ^5 j. y( Q+ H
6 G3 S. x( L; f/ s0 d% I0 aclass Solution {
8 T* x" L4 Z0 }: c \; l5 a Long maxScore;
6 ~4 [9 d4 f) N& V1 [2 {+ \ Map<Long, Integer> count;
* z e. l4 ~* G1 [% x6 |
; ?) e3 Y( ~8 c: p public int countHighestScoreNodes(int[] parents) {
! B# `* t+ y# @5 U List<List<Integer>> children = new ArrayList<>();
3 I1 H V: ~6 u for (int i = 0; i < parents.length; i++) {5 c' L+ X. Z) I0 U2 L+ R: R
children.add(new ArrayList<>());
1 c" |+ \) h6 b5 f }& e; C2 N- S0 i0 w
for (int i = 1; i < parents.length; i++) {
( X1 T: u% d7 x children.get(parents[i]).add(i);
6 a7 h- x8 W; N3 b }3 s* O! W% {% v, y$ j
int[] sum = new int[parents.length];& T; n3 i3 l& h2 w- p
calcSum(0, sum, children);; X" y# Z! g9 j1 s+ n; |; [
maxScore = 0L;
4 @! D: d9 g6 {+ V5 x7 u count = new HashMap<>();8 ?+ O. I/ k C( N
calcMaxScore(0, sum, children);/ D! h+ ~5 R9 ~) f0 C P5 c
return count.get(maxScore);
/ o/ d+ X: g) y; Y' H! ` }
7 t$ M8 c1 k& V" d! b* d2 r% P3 N; i5 D4 a6 O- L! D
private void calcMaxScore(int cur, int[] sum, List<List<Integer>> children) {6 m! w$ C4 V0 ]2 G! `1 [
long score = 1;, V B0 E1 z) M" L( N0 O) f
for (var nxt : children.get(cur)) {9 J8 _! z+ u+ Y; y4 H% I" ^0 B5 X' `
score *= sum[nxt];/ a; z6 H' x5 Y
}
/ f b( X" l; T& U1 e8 s$ |' _ if (sum[0] - sum[cur] > 0) {
. u( r: Y7 q# I9 ~9 O( i" H4 h score *= sum[0] - sum[cur];. q8 |" ]( q& t g$ t+ G0 T& j
}
4 K) E! s1 H Q8 i: j% }, E+ ^ count.put(score, count.getOrDefault(score, 0) + 1);8 Y7 G- Z1 L$ n: B' K5 a
maxScore = Math.max(maxScore, score);
) ?) ~- T) W0 \7 S3 y0 [8 Z4 z( ~ for (var nxt : children.get(cur)) {' \, [: a) M9 G* X" ~1 L3 i
calcMaxScore(nxt, sum, children);
% I4 t. O" h" g5 S }
! N4 w$ f. @* V0 n6 S; F* X; p }
7 G; G8 @; E: M' J: [! t
% _9 y% } r' Y$ q6 `+ C private void calcSum(int cur, int[] sum, List<List<Integer>> children) {
0 R) T9 n! L2 y$ W( G sum[cur] = 1;
! c2 b: V6 ~( ]1 [ for (var nxt : children.get(cur)) {' z- d* ^8 S& |; a/ }
calcSum(nxt, sum, children);, K1 u, o8 w. X# Z; G/ C& l" O
sum[cur] += sum[nxt];0 n# e- ]0 o; C! M& A' `
}
* Q2 P2 B- |' e/ C+ n! E& { }
% G1 r! N3 G: Q! c1 R" K: f}
# K% D/ x2 [; f/ Q
$ j' m, M% b5 S& m【 NO.4 并行课程 III】
) X( | ~7 A7 f" \( G& H
$ A ]+ X9 Z; a7 \- f9 [解题思路
/ D; n. D8 u2 A. s5 Y几乎是树型 DP 模板题,比较简单。令 finish(i) 表示完成课程 i 的最短时间,则 finish(i) = max(finish(j)) + time[i],其中 j 是 i 的前置课程。 w9 O8 [$ O' y/ u# j
! Y& ?; z' y& Y% s; Y/ i/ T; u9 t; p5 i
代码展示
_+ o- k% Q% n5 m& Z5 \! M
& D, E) K5 k. v5 _class Solution {
& C1 I9 e8 B l. N; q public int minimumTime(int n, int[][] relations, int[] time) {7 F4 w2 m6 E" h7 i$ R
List<List<Integer>> prev = new ArrayList<>();# A+ y8 p$ \2 N; i
for (int i = 0; i < n; i++) {
) L* y2 K. U+ z1 i7 ^ prev.add(new ArrayList<>());
* ~ v% H; y2 s2 n8 G0 l }
8 r+ |! j' G9 h9 h; o4 g' C. p for (int[] rel : relations) { X. H- I8 L5 ~1 d% |. i
prev.get(rel[1] - 1).add(rel[0] - 1);7 L6 G+ C) J& y8 O6 h. z
}
7 E2 b& J8 c) p/ T! R3 U2 Z int[] mem = new int[n];1 R! y: A2 w* V/ y9 e' h
int result = 0;
- E+ E2 u g- K/ j* R% j5 R1 Y$ ` for (int i = 0; i < n; i++) {
6 _) M; ?4 S) E; _. d result = Math.max(result, finish(i, prev, time, mem));
, @3 F* V. h/ \ G& `. \+ e }+ @# b: g( c" c9 N8 y9 ~& |3 w
return result;
& Z% i! g. [, e }
9 s' x C+ _! N, x {% A9 [' Z6 \9 v0 @! m+ u5 c2 h9 C
private int finish(int cur, List<List<Integer>> prev, int[] time, int[] mem) {8 T8 Q, \3 }0 r; u7 J# s- P& N
if (mem[cur] > 0) {1 ?7 T- d$ q2 J
return mem[cur];
1 N; X p j9 f* M) Y }
) J& \9 h5 i* V' L6 n, _+ e; M# W if (prev.get(cur).size() == 0) {
# u; x c7 q+ l9 c return time[cur];
1 n! e; t7 K- g4 L* C }
- \, R3 L% J$ l: F( d for (int p : prev.get(cur)) {
% T) b- i) y2 C5 h mem[cur] = Math.max(mem[cur], finish(p, prev, time, mem) + time[cur]);' g# L& G$ e, S9 J0 c
}! f4 z- o+ _- n
return mem[cur];
/ _0 B4 B4 c9 j' t. A }8 h' f" j5 r W5 x, N
} |