登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查句子中的数字是否递增】- X8 m8 F" |% j8 {
$ ^/ H; j; E4 u1 O) r解题思路. L( n7 j6 P( `8 }2 h" A
签到题。
% C- \. Q3 u# q6 I
2 k. h6 ]6 F, M5 h; e代码展示+ C3 } w: P& e% {
9 g) J; u9 R g* t( g; B9 {. B% Cclass Solution {
- z2 u/ o# A r* F1 X/ d public boolean areNumbersAscending(String s) {4 b1 O4 \) O% d6 p, S8 j
var strList = s.split(" ");
- [4 d6 y9 r: t2 t int last = -1;0 I& ~4 c( @0 l
for (var str : strList) {
% d1 N$ c% ~$ ]5 z try {+ [8 s3 i) o$ |6 T% \' E) v, n2 c, I
int num = Integer.parseInt(str);
/ G0 C+ M. B( }; a9 r if (num <= last) {
5 D p1 M$ { V0 X5 f return false;
) |5 j* j0 U* c5 ?6 ~! J* ]4 R }
& W3 @ ]4 U; g3 Z) w last = num;" R) f9 L+ m; A- _6 \2 d# @
} catch (NumberFormatException ignored) {4 @- d# f- G2 K1 H+ l" y; V
}* W; Q* k: Y+ t) e x8 k" x. k- {
}
/ e; M' p1 K, I. U return true;
* h3 q$ }9 l _/ H0 F& M- Z }
. ^! g: N: x/ f6 Z$ r& D}' \0 w% ^3 X# U1 Z% \. [0 ~
8 o" a+ d: Q) @ R
2 p: ~& n c9 g. i+ d$ L【 NO.2 简易银行系统】
; Q7 A) T3 D5 }1 M+ P3 N7 ^% a- u8 o
- a5 v& k" ~, R0 a# i# n9 E* J解题思路
4 L$ M. {8 i% k- K' O约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。/ a4 Q! [" J' a% x
! T- @! q! x, W) A1 u% w* C代码展示
4 `! [1 v: B0 M1 y
& f# a' C! `/ L; T/ Lclass Bank {! H& L t- B6 ]+ Y
long[] balance;0 a Q/ v8 o% o7 @5 F
public Bank(long[] balance) {# F' q% T1 \. w+ J, [
this.balance = balance;
. }& A" D: g+ g3 i. v }
6 F K0 {" {0 v" T( l0 M% ^) `$ ?/ m% c4 `
public boolean transfer(int account1, int account2, long money) {
: p5 [( s2 y! G6 C( ]. l account1--;
/ x: k; a; ~- ?) G account2--;& y6 e: D0 A4 s8 u
if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {
$ c* d, b4 S" m& m return false;% I5 {5 [" B& z4 [% s. W6 \" `
}
/ Y! E H( [4 _5 D% u balance[account1] -= money;& `( S( D! U) n" n! N
balance[account2] += money;
; v8 u0 Q0 v% }+ B& K1 a return true;
q' _5 I# F6 i6 ?2 Z# C3 F }! v3 G& ~6 Y0 a+ ]& N3 V7 \. c+ g5 u" `
! @8 C; u2 ?, O' ]; u2 b9 k: p# g, o public boolean deposit(int account, long money) {
2 [( y* W: s3 `) A' e" J# h# t1 { account--;
4 o* ~: k" I3 [ if (account >= balance.length) {0 u6 g) W3 ?" |& c, E
return false;) `% x# f2 ~$ Z; z# p7 ~+ z
}
- x |! {* ?; l1 [; a+ d2 b& }9 r7 { balance[account] += money;
% K. i/ w- o8 R- G" Z# ? return true;
; ? ~ i2 u' Y7 O* K; s }4 |8 U# A4 x1 I) p/ P. ?! n
; ^1 a; V `7 P, R0 I* V5 C0 E, \ public boolean withdraw(int account, long money) {
1 t, E7 ?1 ~% ^$ y7 g account--;
" i- d3 t2 q7 h! j2 t, L7 E# Z) ^/ i if (account >= balance.length || balance[account] < money) {
7 d8 S$ {+ w9 [3 A" u) { return false;, d9 [8 E2 ^. N: l/ q
}
0 ?5 p% U. g. G& n! V' q balance[account] -= money;/ |- u" s& k. }2 K9 E
return true;
' l/ _4 B0 q8 S6 o! F3 e }5 W8 a: r5 i# Y3 f
}
- P- `& C9 \ M* R5 o3 ~4 b. i4 I7 l; k; H: u
* u: Y2 W. D& j, e) B5 ?3 _& y' M S【 NO.3 统计按位或能得到最大值的子集数目】: o/ M. h9 z* b2 N9 p
! E) |6 i8 g9 l: E, t* n
解题思路8 d2 r0 d6 N: ~3 a
数据范围很小,枚举所有子集即可。) n7 i! q: F" V
) |+ Q9 M; Q' h5 o代码展示! p# @# U8 K1 E V5 s w9 D8 f& l5 V
2 R9 D- [) b+ Z2 w! bclass Solution {
7 x- B9 A. ]' ~3 A: e. \ public int countMaxOrSubsets(int[] nums) {
1 V& Z& r/ i Z6 @' W int max = 0;
' L8 t. F& B, @3 u for (int num : nums) {5 z& O( b5 W( g5 h- w
max |= num;0 ~# T6 n+ ?& W4 l/ z
}& \1 D# M7 c# S2 P& Z/ h
int res = 0;
7 U, W$ O/ S0 A1 v/ I$ E for (int i = 1; i < (1 << nums.length); i++) {
1 w8 v$ S0 g, G+ \# U+ t# a int or = 0;4 k3 l0 d; m9 i( m' }" l% N
for (int j = 0; j < nums.length; j++) {) n3 S) E0 h5 i2 I6 o& J
if (((1 << j) & i) != 0) {
$ {+ W0 C8 T- t; q+ B7 D/ B or |= nums[j]; }' R A- T& f; k$ e1 w
}6 k. m3 Y- W. c1 d
}' C$ r9 j, B6 T' u# y6 @, {
res += or == max ? 1 : 0;
( s9 s8 [6 o5 @0 c: `( x' s }0 n* t, P0 ~& @7 I
return res;- M' k; j5 ~6 Z; y0 n. Z
}4 W8 q0 f0 Z! y8 _0 Y) j7 R' I( P
}
1 Z( m+ S" ~9 k: u4 p/ W8 y
! c; ]' O. z5 s Y
8 ?) z4 [9 z' D% m$ {% ^8 F# c【 NO.4 到达目的地的第二短时间】
* O/ I; P4 b5 ^4 H' |/ I9 P7 y! C4 }8 q* C1 c% O3 |
解题思路, o' E& c. O, z
: t& N9 R' y4 n, w( |3 b
Dijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
7 _6 ^4 z1 g) _; d6 c% T7 P) P& ~2 B
代码展示
2 y* H7 d3 c8 n9 T3 ?
3 ^9 n2 T) Z- o2 W/ Kclass Solution {
) e. D# Q: @4 Z% `4 S static class Node implements Comparable<Node> { |( `, u2 t4 h
int min;; _- d7 L( c* Y& r5 n
int idx;
; p( E) s' p; @; G" a2 ~
) g3 L3 O. L1 d! B. k# ?! z1 w public Node(int min, int idx) {
P; q- Y! E7 ^/ H6 a* c+ |: I this.min = min;
, M% L2 e7 e3 S) q1 o; F; r this.idx = idx;* D) i$ p2 C! y1 c: `, l
}. c+ w* E. S9 f) h+ Y. e0 T
5 ^" K4 @' R6 e" I+ M
@Override5 N; s1 T) j! j; l0 I5 [" e4 ^
public int compareTo(Node o) {/ q$ D/ |, n5 k0 B
return min - o.min;
9 `9 x! {% o' ` a5 I' K- Q% m d; {; v, q }/ K: t7 x' u! W$ d9 i- ]
}$ u+ F& t" M; \( P" V
' x0 n: X6 o h. `8 I! C6 @ public int secondMinimum(int n, int[][] edges, int time, int change) {
. A. Z+ I) P: J: F4 F# I List<List<Integer>> graph = new ArrayList<>();3 a8 j0 `7 r) F2 I/ n
for (int i = 0; i < n; i++) {$ l8 Y3 M7 D! b+ {- r
graph.add(new ArrayList<>());
; j$ D! E4 m0 O8 J( w, c }% J5 x1 O+ H" |/ N- V! l
for (var e : edges) { I- g/ s+ m" G! H9 X& `' i: Z
graph.get(e[0] - 1).add(e[1] - 1);
5 w# \9 w0 Z+ @, a graph.get(e[1] - 1).add(e[0] - 1);7 C2 }3 t0 I( q( O% C0 `: V* n
}
3 v8 X8 E/ z4 W/ M& Z/ G$ H" E7 g( v7 j
int result = 0; // 最终答案0 j r& ^ _# i
int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)
, B" H) M) b8 Q( v! c+ Y% m Arrays.fill(min[0], 0x3f3f3f3f); y! E( u/ X, B0 j
Arrays.fill(min[1], 0x3f3f3f3f);
9 T* t9 }+ }3 G, ^7 C+ M$ { min[0][0] = 0;
" N2 d* o6 k2 v PriorityQueue<Node> heap = new PriorityQueue<>();) \8 \. C3 G" e/ H) |
heap.add(new Node(0, 0));
& N _6 m0 [% a, k while (!heap.isEmpty()) {
' e c4 ]3 g4 j6 c- { Node node = heap.poll();" `; l; ?! c' g2 R8 \0 a
if (min[1][node.idx] < node.min) {
7 A- N, S+ _8 q& \, A( H continue;. N! O( A3 J% z
}
6 H, a6 Q4 G) J% W) z for (int nxt : graph.get(node.idx)) {
2 A9 s& F% @# n int nxtMin = node.min + time;+ {. k) t9 W! n( d$ s
nxtMin += waitRedLight(nxtMin, change);
`9 x4 y1 N8 N if (nxtMin < min[0][nxt]) {
6 C: g, Q/ n+ U+ Y" d# r int tmp = nxtMin;
; M4 v, v2 e5 b0 \ nxtMin = min[0][nxt];- r6 @. \8 _# c
min[0][nxt] = tmp; j- k: l5 I9 ^& `# y4 E# K
heap.add(new Node(min[0][nxt], nxt));5 [6 l% E' u* B! c; v
}
+ j7 j* f3 v, T if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
1 A$ g3 |5 H5 }0 y* s, @ if (nxt == n - 1) {5 b# ]5 `* c" {0 \8 u
result = node.min + time;& y& W3 s' I. D# |+ N3 E
}
0 |1 F+ `% F9 ]5 ~ min[1][nxt] = nxtMin;6 }/ q: Z; m4 A: v y
heap.add(new Node(min[1][nxt], nxt));9 V! ?4 b% ~0 D# {0 q V
}
3 a) E6 F( f! O, j }
$ d$ M- P' l3 K+ S7 G } ]# G) x' e3 D( z1 |
return result;& b* {0 Y0 h2 r
}2 s4 G. y( y9 r- j d G6 b
( D6 @3 }+ ~ \6 g& V5 u, n$ w" ]+ F
private int waitRedLight(int now, int change) {1 u) e) f! P6 V2 y3 K1 K
if ((now / change) % 2 == 0) {$ v2 V5 o( P5 V; p3 K
return 0;( C" H! b3 W8 M' \6 Y7 m3 ?. s
}
/ R. H$ V$ m% b2 I* G4 p return change - (now % change);$ _2 _. Y" D p8 {2 D
}
- Z. I- T2 U9 k2 O0 u: |} |