登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 句子中的有效单词数】
! u' ~# M" ]; [
! B- U" X1 ^5 l' A# K9 z解题思路
. U" f v4 S9 s, H签到题。
( }8 y& m4 `1 q! x$ d% c/ e' V9 x. l
代码展示$ I }$ j) W0 ?) K( \) B" H
# U0 ^ s& l: T7 |. p) e- U B. vclass Solution {' e( _2 ?: {4 [9 g" |7 I
public int countValidWords(String sentence) {
2 S. H+ p* b& c& Z( v String[] words = sentence.split(" ");
6 H; d9 A5 p# P* u- d int count = 0;4 F9 {0 E" p+ p
for (var word : words) {
Y8 m3 r! g- E# z char[] chars = word.trim().toCharArray();% X! X+ y" P; T% m9 M0 ?: _5 y
boolean invalid = false;4 i8 n) }6 W- S$ i
int index = -1;) A# P6 Z) [+ t) V
for (int i = 0; i < chars.length && !invalid; i++) {) w% m$ \* E; q/ u
char c = chars[i];( p' Y( u# `5 N9 d9 k6 i
if ('0' <= c && c <= '9') {
- `% |1 @3 n* Y: }) q' A invalid = true;* g" u5 N- U9 O" E w: `8 h6 V
} else if (c == '-') {
( s) }) {, f) T if (index == -1) {
) a9 x( q0 D- |. J- ]8 l index = i;
, w! ]- Q1 W; h1 o8 K } else {6 ~" a r1 h* N* C
invalid = true; h; m$ J2 r3 N4 K3 M
}) O" S% U" O5 t$ Q" S
} else if (isNotAlpha(c) && i != chars.length - 1) {
7 o5 r/ m1 T4 z% m% j: }; b8 U invalid = true;$ `+ V4 V5 o" E# u; o
}2 D7 f7 i1 N/ Z# M: f$ N; E. k
}
" `/ m; j8 R$ i8 n8 | if (invalid || index == 0 || index == chars.length - 1) {, }5 S) W* Q- U, o k$ o$ e
continue;
2 C' i/ B0 p5 | }
+ K+ r. m% |* f if (index > 0 && (isNotAlpha(chars[index - 1]) || isNotAlpha(chars[index + 1]))) {! h/ F( p* v1 S; a
continue;. h9 U0 f" [. T! H
}. @4 ]& r) P/ _: o( Q! i
count++;) A9 z. Y0 @6 j- O% q5 L9 d9 g$ v
}
) }1 e4 _0 \2 A. K, R) ? return count;4 n* }+ k( r `7 W* J: M3 {2 Q
}
& m# u) S' \- M; L. w3 a$ ^$ n2 h! C s: K4 G3 |5 [8 g# ]" P
boolean isNotAlpha(char c) {; Z6 o4 m5 O; i3 j
return 'a' > c || c > 'z';
/ V" f7 a+ T) }* S6 A4 n }/ R6 h, b, V! e. p
0 l+ {4 [9 N+ ~+ X$ g}
+ y( R9 K$ A: ^
# L5 N# ?' b) M: w8 E' E& \【 NO.2 下一个更大的数值平衡数】 @' m% K8 v o6 _; G8 s
/ T* r/ c& A9 C+ ~$ ?' L# ?
解题思路* \' m7 |) u7 v; S
枚举即可。
+ r+ R) ?" p$ @1 L T7 W4 E9 Z( d4 t0 i0 b) o, V0 X, c
代码展示
. } ?7 b. i$ C6 u( B) A+ p. w$ b' |" r2 L# o4 @
class Solution {9 Z8 x) ^& o" z. _8 d" J) K3 a
public int nextBeautifulNumber(int n) { D% s4 i3 N/ O% b% t
for (int i = n + 1; ; i++) {
6 K. S- T {3 w. P5 F! l3 P if (balance(i)) {
2 v+ z) ]9 e9 _2 S- ^- l2 ]* n* | return i;
* B/ D4 |3 m9 a- q } y- D9 A/ g5 q; m( W
}; ?* M# s) G$ Y& ^" n- }
}
: ?8 {& V; {2 [- O ]' x" P/ Z; x! c
private boolean balance(int num) {) D/ J8 F. `' s: J- C
int[] cnt = new int[10];
& J5 C- p" y4 X: T for (; num > 0; num /= 10) {0 I/ X k3 Y0 L V
cnt[num % 10]++;
3 L- q. M7 _: L0 F) f4 u" o }
1 H: P3 x0 y+ P7 }" k for (int i = 0; i < 10; i++) {: W7 {9 d# T! L. X% x4 O% x
if (cnt[i] != 0 && cnt[i] != i) {$ p9 k: D6 v* n$ |' z% G
return false;
; l( A/ G9 p* E }, X0 U1 t# |6 j) c' U. E5 E
}
% P0 ?$ g: i# q. z3 R1 { return true;
. B4 ?+ V" y8 m& y% w; l }0 n5 }8 B H4 _& K( P4 A" R
}: {& ?! U5 x" p
$ O8 ^/ H+ { g% P" @$ \【 NO.3 统计最高分的节点数目】
3 @/ a6 v; I# {
1 y+ w: I' G% J1 [解题思路
1 W& o9 f3 v& S" B6 \4 w; u' Q! _' l首先进行一次 DFS 求出每个节点的子树大小,然后进行一次 DFS 求出每个节点的分数。6 N; c$ {& [8 K h
5 v5 l/ ?2 ]* B5 T
注意计算分数需要用 Long 类型,避免乘法溢出。
. [+ V" i: h1 \( z. W" Q5 {5 ]! x$ g8 W" v7 k( q3 U! L
代码展示
& P9 `; A' d- z; s, }, s, [& Z. u3 F0 F# E1 Z
class Solution {
+ {' ^: V, g1 v" V1 \+ X Long maxScore;
, c g4 ]2 N6 F* M. q Map<Long, Integer> count;' }, B& @1 o6 ]9 D* X0 S' j- `
8 i; Z5 X, I4 |, p
public int countHighestScoreNodes(int[] parents) {
* `" V6 Z$ v3 z$ | List<List<Integer>> children = new ArrayList<>();
) I. O r, V% G9 @ I for (int i = 0; i < parents.length; i++) {+ q' ?! a$ W9 l8 h$ f3 t: q
children.add(new ArrayList<>());) s+ e c3 o4 g
}# S( @7 o$ h6 q- \- M3 O
for (int i = 1; i < parents.length; i++) {
7 x1 Y) L+ w6 [& ?7 b& h children.get(parents[i]).add(i);2 q2 d; D7 `: h+ Z% {! t/ U
}
; a8 @4 N1 j9 W) G' z int[] sum = new int[parents.length];- n, u: }6 c- n% m1 C7 C5 m
calcSum(0, sum, children);
]+ i" | m' I. g }. F- [( P maxScore = 0L;
, ]8 N$ k. S- f7 P% w7 D& z count = new HashMap<>();* ]4 L1 n0 q3 B- u
calcMaxScore(0, sum, children);
# x( }& Z( n7 A! Z+ R return count.get(maxScore);+ Q* H& q$ S( `7 W9 l: n4 O
}
% ?4 I! e9 d! W5 V; v; d4 h# ]* X- _+ `/ D, v; N! H. [0 g
private void calcMaxScore(int cur, int[] sum, List<List<Integer>> children) {1 A, ^2 P9 u, d2 A) W
long score = 1;, F+ p2 a3 }. U0 T; t% Z! X
for (var nxt : children.get(cur)) {; U' Y7 y. V. B: p8 O
score *= sum[nxt];' \! o% u f6 X4 ~' x8 h
}/ x" o; Q6 x) D4 ?# R/ r$ M
if (sum[0] - sum[cur] > 0) {
z* l: X s; k. s- S2 k score *= sum[0] - sum[cur];. b9 g) S: o7 L! D; V0 Q& g# ]9 `
}: z0 f. e1 n# a: Q9 n" _5 u4 R- _
count.put(score, count.getOrDefault(score, 0) + 1);' k6 e1 _ r) k6 A: R$ W
maxScore = Math.max(maxScore, score);
8 _" ~) v. O: c* D, D for (var nxt : children.get(cur)) {
6 p: L: |( d: ^2 ~7 _/ t calcMaxScore(nxt, sum, children);
}& t5 p; r: c3 S- N }! T; l. n: k7 |/ ~
}
& Y) o" E$ ]; \% k0 t( @* U/ Y
: Y8 R1 y8 { V: U private void calcSum(int cur, int[] sum, List<List<Integer>> children) {2 I# q/ b* X) x/ k( k
sum[cur] = 1;
# z) ]$ \( ], @9 |5 {2 X4 z5 N" F- T for (var nxt : children.get(cur)) {4 D4 [) H1 L x; @0 f& E
calcSum(nxt, sum, children);/ p7 G$ O) `( R3 @! ]
sum[cur] += sum[nxt];2 P4 m: q" ^, V
}
1 ~# `5 I3 _3 L4 n/ Z }) G9 X! G" |9 b3 b' G& G( f
}
+ l9 O y( m# H5 s' y2 |6 h# _% o8 p$ _9 H- A
【 NO.4 并行课程 III】
& Z* V9 h. x& v0 G) I4 \1 P: E: e0 R R) F7 [
解题思路
6 M( }3 a' V1 V9 t几乎是树型 DP 模板题,比较简单。令 finish(i) 表示完成课程 i 的最短时间,则 finish(i) = max(finish(j)) + time[i],其中 j 是 i 的前置课程。
1 o N% m5 A6 D2 N- F- R- u5 a' Y% ~7 O3 X8 i3 o7 h$ R. p. l! x8 B& ~) l
代码展示8 N- R' L0 F& r3 ~5 y8 K% P3 Z/ M
" I0 c0 S! \* K7 m* ^class Solution {
- L* J* V& e1 H) Z public int minimumTime(int n, int[][] relations, int[] time) {
% w' B" h6 [! Q6 l) y S List<List<Integer>> prev = new ArrayList<>();
" T: G' d. A' d: W0 n$ S6 A for (int i = 0; i < n; i++) {
- |2 F: ?5 I) z, y- k prev.add(new ArrayList<>());
{ W& h: }- s, N8 w) \ }
$ k. t+ k- G0 [1 ^& Q for (int[] rel : relations) {3 N8 g9 J) a0 E. n
prev.get(rel[1] - 1).add(rel[0] - 1);
; z$ e# X- [8 G }
' d4 A3 J4 E3 c6 S7 Y int[] mem = new int[n];
6 o6 m0 `, M$ L int result = 0;
( w/ p8 ^9 S6 O for (int i = 0; i < n; i++) {
$ u; a9 o; O8 y' ^ result = Math.max(result, finish(i, prev, time, mem));
2 d0 g; M k1 X6 C6 w }
/ q9 b O# F9 Q5 V& X" Z- [6 [ return result;$ M( { K/ {7 L" z2 `
}
- C7 o; r) \9 R
* p; u, }$ c$ a. j private int finish(int cur, List<List<Integer>> prev, int[] time, int[] mem) {* \4 z8 c- n6 G; ^' g( ~& i$ v
if (mem[cur] > 0) {
?* w1 v8 ^" b4 I% u return mem[cur];
$ H' V8 i; f9 d; r1 ` }
* z( Y3 k9 \, ]$ A1 D if (prev.get(cur).size() == 0) {* Y# A. W- N6 f8 x& l, |
return time[cur];
0 S) c) Y5 K6 i2 I9 [$ Z }# n6 @: V: v/ A
for (int p : prev.get(cur)) {
7 L- e2 I: l1 ~, b mem[cur] = Math.max(mem[cur], finish(p, prev, time, mem) + time[cur]);; ^# L: Y( W5 v- J1 c7 \) H% U) a
}. D# S$ B( _, r, p3 @! L
return mem[cur];
! |) |+ {6 F; o7 J- E. ~+ w/ c }
$ a: s7 t! M: D! C9 o/ Z L} |