登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查句子中的数字是否递增】/ G9 F; z; e3 a) G) p. F, N
0 F: m% q# W; b4 s" v解题思路/ [) ~; V9 D0 p5 }& R% {+ f7 U$ r
签到题。0 p, C1 @! B& W4 ^& e$ `6 }# t; E
2 H4 y. c8 |. a代码展示
4 [4 H9 ?8 I6 g2 f$ C0 J7 ^, ]) y
class Solution {# G: s4 V$ w% N8 K" }6 V
public boolean areNumbersAscending(String s) {; a6 Y1 ?( ]& w; d4 W7 P; K
var strList = s.split(" ");
1 _' n" J7 K0 t int last = -1;
. b. \# ^( B" g for (var str : strList) {# ?) R, J Z3 t( |$ Y( h
try {6 W5 y7 f, z8 j# V
int num = Integer.parseInt(str);
2 }* B) Z- c" k if (num <= last) {
8 z5 y, V/ Z6 L5 e9 K( H5 V return false;7 E1 P) I& M7 s9 L% M8 V& T
}3 {2 F) m+ ` _ q
last = num;
; I: T) f7 J9 F5 V } catch (NumberFormatException ignored) {
/ o1 L9 M0 f6 E0 Z) u" R/ S8 _ }: ~1 ~$ w. B3 p0 o: ~
}
( ^% I( g) R' a' Q4 H! B return true;
: ~7 ~! V. U s, s* G/ V }* X- D& a0 q% i$ m% }) \( c8 G
}! z" P6 F+ h1 `8 X
" y; f2 D; r0 k) K( Y3 U h' N5 I& s# v7 a$ T; d
【 NO.2 简易银行系统】! N7 M& v& a" T/ t: l1 y; D/ j
! i/ `* F0 _/ e+ G8 R解题思路
: v& S: \5 W: G+ S2 a" c约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。
5 ?4 R, l' e. T1 n Q! T
% K% a$ |3 M, m. y7 z代码展示; c0 V& Y; f# D6 ^, y
' X/ u5 t! P, ]( I) O$ t0 Y: G: d6 `class Bank {6 n+ \ A5 s1 [& x) [$ k) r4 O
long[] balance;. [% w. L5 i4 a/ A: D
public Bank(long[] balance) {# M9 a4 N( l2 n) N$ r5 ?
this.balance = balance;6 |0 U3 @$ r0 y8 Z) E# x
}
0 @; _' b' c w7 [2 C9 u# }3 z7 P
4 B4 `2 R; K' S" s& u public boolean transfer(int account1, int account2, long money) {1 l% o7 \/ x0 A2 L
account1--;
! `# T$ g1 K0 v% m" c' Q6 ` account2--;. n& H6 A2 W G1 i$ l, K
if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {. z f- u0 d7 i8 Y0 B
return false;
G3 X3 I- A* ^9 ?7 m }3 ]* }" @* E# b' t# a1 L6 a
balance[account1] -= money;
# a9 X: B$ a' r4 q: z balance[account2] += money;% V1 x. `* N# e& E" i( G
return true; P. Q" m, a6 n4 w5 [7 Q9 C8 @4 O
}
k) H: K3 s; v9 R; Z# n( D& v0 Q) R
public boolean deposit(int account, long money) {+ h! q1 L! t; u3 @* [9 i4 a6 K2 Z
account--;) l) `7 H0 t: Q: D. V
if (account >= balance.length) {
' m0 b& Q( d& M return false;/ G. H4 u4 o* G2 m# }
}
. p1 ^' H9 p2 G$ h4 i1 U balance[account] += money;
; R! m6 P: n+ l0 \# O V return true;
& P4 [/ `# F. u9 @9 z }
) F; K; J1 G$ a! V
2 g: d1 [9 k/ [0 K4 l$ p. f4 t public boolean withdraw(int account, long money) {
2 @1 V4 P, J1 B- L5 l account--;
. ^% Q! k) M; w/ t if (account >= balance.length || balance[account] < money) {
: ~# Z' ]9 R" i9 y return false;8 w9 n+ K$ n8 [
}
2 Z7 [" c% f" G$ v0 E balance[account] -= money;# Y f4 F8 q" g4 Q
return true;
: f" }0 v0 Z# z+ o1 C/ g }( u5 z3 U D/ ^% D& s; ~6 p& R) o
}+ n, u6 n- _% I. w, X
: W% c! ]4 m$ m: }7 {& q) k
- W! p& V7 n% h H& y【 NO.3 统计按位或能得到最大值的子集数目】. `$ J/ O* P) \8 k$ g
, ^' {2 `! d y2 }, f解题思路
7 j. W; O# k& k/ I' r( e! @数据范围很小,枚举所有子集即可。
0 h) e {* q' [/ i, v3 |
) Y+ l8 Q1 r g代码展示* g7 [7 X& ^7 r$ {4 b2 q3 w0 Z" K
3 ^% o5 Y4 _3 Q/ k sclass Solution {& C/ }7 j9 \- d9 F
public int countMaxOrSubsets(int[] nums) {
; _6 w% V/ L# |: X* @% w2 b7 f int max = 0;# X2 o" k- a* K+ U r1 O8 f
for (int num : nums) {# \+ ~/ F, s8 ?1 t+ a2 N
max |= num;6 m, D- [( R! s. Z, O
}
+ G+ \% Y( m; {. z int res = 0;
! O+ u* u) c5 A) {+ n4 C for (int i = 1; i < (1 << nums.length); i++) {& I! y. O3 q9 B
int or = 0;
( b3 |- i/ N: j- o$ L8 o( o- i0 ~/ ] for (int j = 0; j < nums.length; j++) {; _( j1 o; l3 g) I0 `4 h
if (((1 << j) & i) != 0) {& m/ l+ E% C# N0 E( I7 U; ?
or |= nums[j];
" w( U% _2 J' }4 Z" ~. k }" ~9 ^5 B3 X: X1 Q( d
}
6 ~1 p V& I5 ~1 u res += or == max ? 1 : 0;2 k& v5 i2 g: s: x4 v& D2 R
}1 L' M+ Q: r2 V& X) s
return res;0 n" s! X' w8 h
}( D* L4 @5 r% x# y5 f
}' o$ D4 @6 U. m9 G; M
! k- j; Z: o" k
& A% ?* j9 m7 f& O" @【 NO.4 到达目的地的第二短时间】
P* \0 C% N% y% u
5 i6 U6 ^/ Y# j: t" G4 U解题思路
: ~3 W6 k; b' w2 g& \# ~" T# p" n; \7 r3 s/ n% D
Dijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。9 c) S$ h. ?0 c
7 E; l5 K2 z7 H% y4 E; @& p代码展示& ]( F- z1 i1 G6 E5 ~$ M* g* g
% `9 x* H+ o, ?. Hclass Solution {' L( p- a5 b7 _0 [7 E# K9 o% [
static class Node implements Comparable<Node> {
: I Z( n$ J, h" t" W P int min;
9 Z4 x' s$ \3 J( M, V+ h int idx;& l3 g; L; [: K8 P/ O
1 ]6 z& ?5 \, F' {1 T0 U* }
public Node(int min, int idx) {: v5 f! p" f" i3 r
this.min = min;
. W% H1 h5 x( }; K8 U this.idx = idx;: b4 x! W3 b5 R4 X$ e- M
}1 N( J s. @9 B* r: W; w5 e
6 z u$ P8 w- N& E" n# q' U
@Override! u: N" v6 U7 q+ Q# l" C3 s/ S
public int compareTo(Node o) {
" Z& s) o* {$ \) @* \6 _- ?) _ return min - o.min;8 D. G1 k- @" w
}% p6 ^- x# _( y: ]# \
}
! E* J3 H, \( T* h6 T, i( X7 z+ I4 z/ @( W5 N- b) A f. a" u2 k9 j
public int secondMinimum(int n, int[][] edges, int time, int change) {
8 }( D3 p8 F+ ^6 ]% u8 K: m0 r3 j) _ List<List<Integer>> graph = new ArrayList<>();
: @4 b: R7 A( e4 ~' K9 X for (int i = 0; i < n; i++) {4 u* a& u) e: J8 E- ]' H
graph.add(new ArrayList<>());
' ^! U2 Z3 H; E }3 R4 p% O4 }- c6 e4 N7 ^# D
for (var e : edges) {
; n: b( b- V: T' W7 {- `% p graph.get(e[0] - 1).add(e[1] - 1);
# Z" g$ C! l: X9 a5 R( B graph.get(e[1] - 1).add(e[0] - 1);
- V9 [& a9 Z }- R) S- P1 v5 l }
+ Q4 R; p) i5 g+ e: n2 r+ R S* m9 z8 E( O) F5 q0 V% G, [
int result = 0; // 最终答案; \8 [" V" _: d/ u' p$ H0 _" m5 q3 ^6 w2 |
int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间), f" X* u: p6 e# Z5 A6 G
Arrays.fill(min[0], 0x3f3f3f3f);+ ~/ r1 _. K2 k# K: P
Arrays.fill(min[1], 0x3f3f3f3f);' t5 x2 o& n/ S% U4 H
min[0][0] = 0;
% ?2 u' a: M8 j! T! i PriorityQueue<Node> heap = new PriorityQueue<>();1 {+ m7 H5 @' R
heap.add(new Node(0, 0));
/ u: V# ^" E- W$ y b1 X. R' c while (!heap.isEmpty()) {
) a6 K1 V% y2 m: Q* S* b Node node = heap.poll();
+ H9 q; Q2 u9 u3 j5 B. B! R if (min[1][node.idx] < node.min) {5 z1 \" ~5 T {) \
continue;
, u8 E2 T# Y- z9 K6 m }5 P. B8 I& v% }& q* M E) i' f
for (int nxt : graph.get(node.idx)) {+ V+ l/ _6 k7 O" j6 c
int nxtMin = node.min + time;
* M! r* I' K: q% K9 c+ N nxtMin += waitRedLight(nxtMin, change);
X8 Y% M2 a( o* S! u3 N4 F% d) Q+ Z if (nxtMin < min[0][nxt]) {
' c9 |' K0 j8 a* g int tmp = nxtMin;
* V" Q7 N7 S; I* E M0 ]) K nxtMin = min[0][nxt];
) M& d8 _0 {' b0 {7 M min[0][nxt] = tmp;
5 i0 `' p2 u9 C heap.add(new Node(min[0][nxt], nxt));
3 r8 S8 u5 O9 h* ?6 _3 W }) K* ^+ K7 f8 q, s1 Z9 z- Z
if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {# L" v; }2 ^: I6 S
if (nxt == n - 1) {" d; O, B- \/ z3 n% R/ I/ Y
result = node.min + time;. z7 [+ P& n6 r- o" _4 n9 r
}
+ T/ W/ Y: F- Z# s6 D8 a+ b min[1][nxt] = nxtMin;
% H/ w s' ?6 b' f; m$ x3 ~ heap.add(new Node(min[1][nxt], nxt));' c) r( W8 v. k6 i8 u3 m0 m
}
0 O& E- C7 a' W+ Z, p, I }
2 e3 O; X$ ]; _* n# Y: Q* w4 @ }* p2 [+ B+ @3 ?( f
return result;- b" g# ~- D9 I1 J) J
}. L$ o e# v1 @
' P, V X) X3 G8 a
private int waitRedLight(int now, int change) {) }# ?8 ~4 p/ i7 K M6 u
if ((now / change) % 2 == 0) {3 }6 U+ M U6 X! f5 Y, e$ T6 |- L
return 0;/ M6 l4 H. W# ]/ a6 W& ?
}$ ?; {/ p: p0 H: I
return change - (now % change);
0 u7 ~" Z$ [% x$ O0 L. l' ~ }
0 {& e! g4 T$ Y, f- E} |