登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查句子中的数字是否递增】* O1 X' R p! H* s x+ z- x5 Q* o
" w# b# o1 y) l$ @% I1 J解题思路
" g5 ~$ t/ H* H$ Q签到题。/ `8 B% p9 H. S I$ k
0 j& p2 W2 p( G- I! m8 G
代码展示 r4 F0 S4 T9 G2 Q. p/ k
" e/ f+ V6 \6 f) \( N [class Solution {
( [+ a0 V. ?6 j& F1 p public boolean areNumbersAscending(String s) {2 v0 Z- Y% X% J
var strList = s.split(" ");
! g6 J- j* z2 I* H+ N int last = -1;% i1 ~4 O% \5 O) E* Q
for (var str : strList) {
. M9 p: \9 X6 s' M" u: Q) _ try {
: e0 `% T& i* b% M/ I F. r" X int num = Integer.parseInt(str);
4 [$ n- ^0 s$ K7 u if (num <= last) {
6 h6 Z+ `/ S7 Z# V* v& `& Y return false;
6 T8 i6 `+ T* v y }$ L, Z' q! W3 n+ a$ E+ g1 ?
last = num;
. K) h+ t3 x$ ?6 H e8 U, o M$ g } catch (NumberFormatException ignored) {
9 w! c' F( Z- A* J# b% c }
: G' q. y0 S1 t }) n% W7 s; b3 J; k
return true;
8 J) I$ U: \* z7 B/ s, [- p1 b }$ N# H' F2 M$ `) \
}
2 q& Y$ o$ v- z0 s5 e! x$ N$ a$ A* j+ ]
: h8 f6 b: Y3 E0 f% q【 NO.2 简易银行系统】( W* ?& y' k3 O+ ~; h% n
1 _, X/ r0 g; X# u- P解题思路- s+ Q3 g( ]$ W4 O! `1 } d
约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。
% X) Q2 ]2 o/ Z: u- K* d7 E% h3 Q
代码展示
T2 `' r' _6 ^2 ]3 p9 x
. m, Q$ |8 R3 M! E: ^9 E* P2 h; ?class Bank {
) x R# `2 _# Q; }- d$ D4 F long[] balance;' O* R) j2 r8 f. p% Z# l4 G
public Bank(long[] balance) {, C4 U2 a0 e) S
this.balance = balance;
7 q. C# p* G! v4 p }. e& D2 F# A& h9 a
4 Y- A1 N V/ s# C public boolean transfer(int account1, int account2, long money) {# J9 o/ F6 f/ H/ w
account1--;
' f ]' ]: D; ~$ _6 w! X9 f account2--; b2 m) Q& ^7 w+ I
if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {
( g. D' i- n, C3 \" X! d/ w return false;
, I2 ]6 P6 m- d: o% @8 ?: a }' I& s2 m b1 Q' Q; @
balance[account1] -= money;
% l {3 q3 S$ F! g5 y7 w- D& Q balance[account2] += money;0 ?% N1 D4 O0 N$ c0 w
return true;
`# @/ P6 P- a. ?/ O( V" A4 L }/ _- T2 w# O8 V7 K
& c% T+ ], ~/ w! |3 [ public boolean deposit(int account, long money) {
- ?. } r5 n- A6 M. s account--;5 ~- X4 K: d4 ?7 L4 P5 x, O) L
if (account >= balance.length) {
6 @; M' @7 k$ {. C! C return false;
4 \# ]9 q& }* X* H$ V }
- q7 ^' j1 a! u! G) d; r. _" D balance[account] += money;
e& [( q2 e/ E return true;
5 F- Y4 B& G& d& q) I ?' s4 O6 ` }: l8 {& Q9 B! Q. I1 P
% W* s- q- r5 _0 ~ public boolean withdraw(int account, long money) {8 Q1 s' ` R& m9 A' @( I
account--;- [7 V' b+ o8 D0 J5 `3 n) {4 d1 @
if (account >= balance.length || balance[account] < money) {0 ?- y7 F- o% {/ b @+ S4 {1 |
return false;
8 Y% ^* ]9 R3 I& E1 A }
) c7 e* R5 d2 z. {8 a# |9 J7 j1 C balance[account] -= money;% `- z. O: p6 s
return true;8 `: I; _ H) g. ?% S5 S
}5 q6 a( J) H9 l4 L" F4 _" O
}
% @; t# j% t. I4 q$ G- m9 z' Q
9 `4 D7 m) S6 u; x' ?6 S. t: z) f, t& Y
【 NO.3 统计按位或能得到最大值的子集数目】
/ q# |7 S2 k% w# q, X
3 t6 ^- ?' V4 b/ J* \. v$ H解题思路; u; u8 z' ~1 N3 O( `
数据范围很小,枚举所有子集即可。/ c8 r5 I8 R# c9 i- `8 Z
* S M, i+ f" E) ~1 L
代码展示0 P( ?' l" o4 k8 y9 I' L
9 |0 G0 s0 ~. `2 R4 o4 |
class Solution {
' ^" ?- p% O9 ^! w0 _, O public int countMaxOrSubsets(int[] nums) {+ K2 R7 M% O+ @
int max = 0;
, E5 ?) l0 S4 y6 S% }# J6 S/ w) H9 e for (int num : nums) {2 j0 P- A$ g3 h7 W( F% n8 v& A
max |= num;
* X: M' U' n# D) z, u C }3 |& n+ y. L; p3 r
int res = 0;
: j8 L- c( [! m+ j for (int i = 1; i < (1 << nums.length); i++) {
7 k F8 c- m0 t+ W+ G0 ~$ i int or = 0;
2 B; J% M5 _1 h4 A9 W- c: g% k for (int j = 0; j < nums.length; j++) {; P( u: P" W, @
if (((1 << j) & i) != 0) {3 P7 p, C3 I \
or |= nums[j];
$ q' Z) L$ R5 n1 | z }
7 ~7 ^4 }+ q0 ~* O" e }
& J% x, |9 D8 t8 @& I: S* c* J res += or == max ? 1 : 0;( e( @! S% x" i, H5 z9 s
}2 a4 B& w( C9 B) V6 E0 z% D
return res;
/ W7 q: I5 M8 Z* U }
2 P& s& t6 b0 n6 V}
! y5 T& j2 H. I, ~6 {; f
) }0 r- Y; b1 ^& q; c9 u6 ?5 Z
2 k, ^) g6 @7 C" R( W【 NO.4 到达目的地的第二短时间】6 h$ Z" u; Y2 N/ u- k
6 T: W' f% V, {7 C- B解题思路
+ C. V7 F0 T" Y# p1 Z
1 f: @# |% ?, H( ]. BDijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。( ]: m# \* k1 V9 J
$ ]% h& T( n# j代码展示
' I2 \& K4 C: l9 d d( C7 C6 Z, s9 K9 Y) n: F
class Solution {
4 T1 s( J# o' }( y3 H0 i' S static class Node implements Comparable<Node> {9 S- n b+ g' U2 o7 P- J6 o4 ]
int min;
d5 }3 ?& q) K' c% \: @. U int idx;
X7 U9 Z6 W% @3 L4 `& h2 e
( i9 p/ ]( ~, J; w! n public Node(int min, int idx) {* N, r9 Z3 S+ h% i
this.min = min;+ I: x9 w A% Y; P: l4 v1 Z8 ^
this.idx = idx;
/ E* p; J- `9 c/ S }
% d% U, e+ @& u$ G, j+ J# m g
( b5 w: Y+ p2 R/ q @Override
+ j6 V3 i$ M0 j. u public int compareTo(Node o) {
$ Z( \* @# J& L1 L9 ]" O- u( X- M return min - o.min;
/ i. e" a* C7 b( ^+ I" L }; ` s1 u r, B2 [
}
7 h& _, p9 F0 u' i' }
$ o& i5 L4 z7 Z. P- J- T9 [ public int secondMinimum(int n, int[][] edges, int time, int change) {
; Y) _8 N2 P) U% E5 ^8 ~6 }5 p! ` List<List<Integer>> graph = new ArrayList<>();6 C W6 I# d1 B# J3 X9 \
for (int i = 0; i < n; i++) {0 `# f3 W" E( h
graph.add(new ArrayList<>());
7 z' z; @) x. u$ D# [ }4 J* o/ D! b4 A- s) v+ O- u
for (var e : edges) {" Z6 T& P' T" W7 }
graph.get(e[0] - 1).add(e[1] - 1);
$ e+ J3 n9 s% j* L# u) E5 l2 X graph.get(e[1] - 1).add(e[0] - 1); @: x7 \" f) p9 R q, w3 f: k9 ?
}
% H( {5 q5 L8 g
+ u. l" P u: m( ^, h8 f7 ?+ q- ? int result = 0; // 最终答案9 l5 ^- [1 m; e+ e) a& @# H4 q
int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)% z) B0 p' g: M
Arrays.fill(min[0], 0x3f3f3f3f);" p0 G8 U1 `* H, ?: c4 q8 x
Arrays.fill(min[1], 0x3f3f3f3f);
5 W( x: P4 N) G/ h min[0][0] = 0;
1 F: u2 L5 U" h6 }) D1 C PriorityQueue<Node> heap = new PriorityQueue<>();* a/ }8 a- T! M3 c
heap.add(new Node(0, 0));" d/ _3 |- E5 q9 Q2 f% `3 q
while (!heap.isEmpty()) {
( B' X/ q: d8 n6 F5 k7 r" ^ Node node = heap.poll();
3 \/ T" L+ k) F. Y1 x if (min[1][node.idx] < node.min) {
3 {$ f, z0 a& {; v8 y$ x& t continue;* r/ D. G: Q2 P5 _& v! p7 |
}8 ]/ K0 V8 t H8 P7 y
for (int nxt : graph.get(node.idx)) {& U9 r( O& D* U, k6 n! F
int nxtMin = node.min + time;$ y1 a/ O, A \6 u8 Y5 U3 q
nxtMin += waitRedLight(nxtMin, change);& ^7 E! X! _' s' s. ?
if (nxtMin < min[0][nxt]) {
/ @/ W S. { l! ?& P$ x& y+ D7 s int tmp = nxtMin;
9 Z5 Z7 D; i6 s) | nxtMin = min[0][nxt];9 S2 @, B0 z9 B0 ?8 B( B* q2 c D) l# u
min[0][nxt] = tmp;
0 O1 r) |( g+ H" i4 X9 J+ x9 F heap.add(new Node(min[0][nxt], nxt)); a& |% x! s3 b
}, @, g% g4 k! e/ `; G. r
if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
, h% k8 T& l: S; N4 m# _ if (nxt == n - 1) {
! I5 r+ @4 D d6 \( w9 m result = node.min + time;
+ c+ F; ^' m* _/ V, v, r }9 J. G3 h" T" V1 r1 y/ @7 c2 `' K
min[1][nxt] = nxtMin;5 x/ n, Y! W& q$ z
heap.add(new Node(min[1][nxt], nxt));& k8 S L9 F% j% S7 a
}. Q, e: Z# Z7 d; Z4 p# w
}
! Q( g! P0 C% j: N" U) Z9 Z }
L" f; A: ]: n( ^$ h3 j* N return result;& c, m, \8 a T) f$ K/ D
}
4 x6 n9 l; i. Y
. g& o1 y4 \0 S1 ~: K0 ~: _% ~ private int waitRedLight(int now, int change) {
' z2 y+ O3 ]7 H3 `( j/ P if ((now / change) % 2 == 0) {) Q0 a7 P5 T: ~
return 0;
) a, E9 j' m: j3 t6 E! S }6 z" Q$ f& M3 `# h1 X/ D0 ]
return change - (now % change);9 ~: ^1 c7 O, R
}
1 H5 F5 X0 ~; P6 A2 _} |