登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查句子中的数字是否递增】0 X6 Z, V2 N" H
; F$ [2 ^2 z4 H4 ?- u {+ D解题思路% P" ?% G! T2 z/ [' A1 z
签到题。4 F5 N, A' H- @- i' d8 H
3 |5 O8 G, ~0 X
代码展示( \7 h" u. I% t8 X2 v
' M" w6 i2 ?9 ~class Solution {. h& w" k& U1 @& d+ [: E; K
public boolean areNumbersAscending(String s) {1 q# ^; E- ^, t
var strList = s.split(" ");+ r' S( P: a! L' d* l' L$ |
int last = -1;
/ [6 C/ B4 T% H7 r* l for (var str : strList) {
, j5 ?) J2 C# A0 w try {/ W3 C$ |% \" g. E
int num = Integer.parseInt(str);
, [3 h* v! _, R6 G+ K- S if (num <= last) {
) t6 J* R7 O8 f" O return false;
" w! J1 s% u# j' m- U }
, _. C! `5 y4 L last = num;
+ A2 L9 T$ M. |# g9 V2 y1 g M4 t } catch (NumberFormatException ignored) {7 F: k6 \! k% H4 G8 M" Y4 x" i
}9 w2 M4 Q' [! ]8 T
}
/ ^$ ~3 x$ {% U/ W6 g/ H return true;8 T; z: R7 ]. D
}
5 G& E1 p: t: A! Q7 O3 v}- D, t2 q# Z' U3 A! Q3 B0 q4 I( p
* V3 z" C$ o( M* O! e- n6 Q
" _& @; i4 r% {7 Q; i【 NO.2 简易银行系统】
: E/ `% _- H. [- |) I+ ^# S$ C' |! Q. y
解题思路
. N- `0 F5 Y+ J& C约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。* L! g( G' L, H8 U/ a
3 z/ Z$ T# G. E代码展示% i, a" R/ j9 c. V! S
* v5 \# y! Y" M- _# x* R+ l$ Yclass Bank {
2 R6 I/ @% Y5 h- K1 Z long[] balance;! M' O. T/ H- T5 \
public Bank(long[] balance) {1 E4 T, i2 L; i* ~3 @/ g
this.balance = balance;
! z0 H: l6 h% s# z# f }
2 C t$ ~% M, a' R n
) e2 ?* ?' \- _# h# ~ o& ? public boolean transfer(int account1, int account2, long money) {
$ z8 e3 E" P8 I+ o# z3 |2 L. K5 | account1--;8 c# y- H) \) ]* D3 B
account2--;
) q+ D3 ]% ?+ ]8 A: F1 R1 A) K if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {/ H0 Y+ s; h8 P6 D- _3 _4 a- z
return false;( r$ `: i* Z& P$ H' _
}
q# ]3 c' F6 r" J- X balance[account1] -= money;. A0 B; b- ]; M1 r1 @1 m9 u
balance[account2] += money;1 l8 b+ X+ y7 q4 t4 K& A
return true;
: M1 {1 X/ g; |. t7 e( } }
- G; V& ~6 h5 u+ C. ?: G6 b, Y9 s5 `) Y* b
public boolean deposit(int account, long money) {
* k5 k- Q! e- y# K9 G/ e: B account--;( [7 o. [: |5 w& \: ?
if (account >= balance.length) {
, ^# \0 I" ~. B2 W# L7 x7 |! E. z! M return false;. ]; j' i$ \8 C& i8 Y3 h5 P O
}" {# Z8 f% s$ ]+ E
balance[account] += money;
+ [! A1 M* G& N: { return true;5 ?) ?& P3 Y1 A3 g
}
( K6 i6 o4 D" `# x! ^( \; ^ V* d V5 k. \
public boolean withdraw(int account, long money) {6 ~) N+ M3 y/ ?; w# w
account--;& l1 y- b$ m6 y% M; q/ p
if (account >= balance.length || balance[account] < money) {
; {: h# c; ^+ S' n/ [2 d return false;% [, {6 Q5 ]! ^- F$ v! l) _
}* m7 {2 `1 n6 J% t* M5 f) d
balance[account] -= money;8 z/ j+ u$ A' g
return true;3 P$ Q! e: C k0 M3 q7 V; J+ C
}
5 _# W5 Y& w5 e; b9 x8 p" N. F5 q}9 k) r# S; s5 Y9 H
' j6 m. x" M- V' `; a* g. ^
- D% Z- C* q$ {9 p; Z【 NO.3 统计按位或能得到最大值的子集数目】 \+ m4 ], M$ K( z) ]1 T
4 @. C0 S0 a* i5 U解题思路
9 n x0 ` m. m* e( b' }数据范围很小,枚举所有子集即可。4 M7 h' Q9 \. Z, ?% j- d5 Q
5 z0 s P; Z3 T" k! V& U4 M8 b5 x代码展示
5 ]* B4 D) b4 a8 t, ]1 c h! }+ r
class Solution {8 \* s& Q2 J' c+ ?# ~0 V" {
public int countMaxOrSubsets(int[] nums) {
/ G! D, h6 B/ ]) r int max = 0;
$ J3 @" F. D- b: x. }" C for (int num : nums) {
3 j7 R4 E- A0 L max |= num;: L) e. j9 i4 z, j0 Q
}
. v. ]( s F/ u1 k1 U5 u0 y int res = 0;
! [0 s0 I E9 H$ b: ? for (int i = 1; i < (1 << nums.length); i++) {1 I5 y R6 ^* e" ~
int or = 0;) t) V0 Q0 U1 T' k+ g! r8 T2 [
for (int j = 0; j < nums.length; j++) {
5 d& _ B1 c! R' R8 _2 [$ m0 z) m if (((1 << j) & i) != 0) {! f0 k& e. y2 |2 _ g
or |= nums[j];
$ V, @ U. f3 A R7 R8 o }
; R9 K' L% n% ~+ `; ? }6 |5 }- w& Y! }
res += or == max ? 1 : 0;
) C' N" d# S/ g+ k. A0 V/ J }+ n) S" h7 g" u% G0 g
return res;
, u; b9 o e: e. g( O2 v }, ^- ~: U: ^6 Q( @, V) O
}
6 \3 _5 k* z3 R j9 F" _" l& |& u+ o" G
$ {' F3 f a6 b9 ^: [# ?- u【 NO.4 到达目的地的第二短时间】/ s8 K/ z9 B9 ^
% ]$ T% k* }& k0 X解题思路0 Q A5 |. ]; o0 o7 I* [
' r! u4 _4 j6 t7 BDijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
8 O2 ]5 Y% b7 I
( F& w$ U+ N- D; j代码展示5 `# e1 J) R6 M6 `8 f
( `' \1 y6 k& H% j8 vclass Solution {0 W8 U1 y% w# W1 x+ W W& `; c d8 R
static class Node implements Comparable<Node> {
, {+ k3 r( d) {: P, C int min;
- F. m9 @) R5 t, B, i7 D. o int idx;
% |7 y$ O1 O+ D
8 B3 A+ U ?6 m, E# W- o public Node(int min, int idx) { E. m, V' d5 P" N2 l# ^
this.min = min;
& Z8 l+ k. C2 k4 W: Z this.idx = idx; @+ s+ {$ s+ w! q! p) s& U% b
}& Z4 Y0 T% J) \, q
4 N. T3 }0 J3 s5 o+ Z E$ D @Override) ]# l2 j0 @' F @, u6 d
public int compareTo(Node o) {) ]+ Y! o0 U0 t( ]* h8 d' ]/ O
return min - o.min;
5 h% {' k& e! \, \. c2 ^' s }2 S" C! x' A% P1 C
}; y6 B( X5 o' }; b( V
" [( V# Q, W5 ^( j" S3 c
public int secondMinimum(int n, int[][] edges, int time, int change) {
! F: ?. m* u+ o. L/ L List<List<Integer>> graph = new ArrayList<>();
8 h8 J7 j, H2 L7 u& _5 @8 |* a for (int i = 0; i < n; i++) {% m0 W; h& w: ^; x+ Y/ `
graph.add(new ArrayList<>());
6 @8 i' p" m1 N7 ~% W5 ` }
1 ^% p4 F* r( r9 ?+ u0 r4 {6 ^ M for (var e : edges) {9 p$ q6 x' S$ O5 N3 ?
graph.get(e[0] - 1).add(e[1] - 1);
+ w: C7 \6 z' { graph.get(e[1] - 1).add(e[0] - 1);! S8 A E& Z! {. O; ]" z8 F' X3 W) B
}+ ~9 w2 e! J- K2 N% z( s
% t7 ~& U. |: K2 } int result = 0; // 最终答案
0 {% x4 N5 M8 E) P) f5 Q' V9 W+ v int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)
; o0 x; Z7 u4 G4 }/ A# u$ g Arrays.fill(min[0], 0x3f3f3f3f);, X4 ~+ L6 A7 ~# ~7 n
Arrays.fill(min[1], 0x3f3f3f3f);' ]/ v' t. J- e2 D
min[0][0] = 0;1 o4 p3 |# ?0 H
PriorityQueue<Node> heap = new PriorityQueue<>();
- @( i' O( T; o# I6 ?- `% m heap.add(new Node(0, 0));2 R0 X& B. X! X/ j
while (!heap.isEmpty()) {8 _! y, z9 D N
Node node = heap.poll();
0 m8 G; @* }0 q( T2 c if (min[1][node.idx] < node.min) {
/ L9 @+ `+ b1 n* M( x5 f$ l continue;
' w; E6 `6 [# D4 n }* R2 u- k( t/ U
for (int nxt : graph.get(node.idx)) {
& s! w( p% j- c, C1 j int nxtMin = node.min + time;1 e8 X/ P+ J" A) A+ ~
nxtMin += waitRedLight(nxtMin, change);
7 R' ?6 L* R: m, F if (nxtMin < min[0][nxt]) {& k2 R. M0 ~ F. |7 y b( ^- l. ^, _" g- l. r
int tmp = nxtMin;
5 ], b3 F1 t5 k3 F nxtMin = min[0][nxt];
% ^. F! U f( r7 Z$ m+ y8 [ min[0][nxt] = tmp;8 S* @1 ^% I9 [0 H a
heap.add(new Node(min[0][nxt], nxt));
' w2 D( {. q" \1 s( ~& d( F. {. w }
; R. w* i0 ~4 C% @1 E+ s r if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
# t) a& G+ n0 ~1 V# S) V5 T6 A if (nxt == n - 1) {( q1 w6 f# L1 n: s, D9 U
result = node.min + time;
. ]8 s" G0 p5 A- d+ |# Z }
/ h Z- v& [5 j! H min[1][nxt] = nxtMin;* X$ U! w. ]4 f/ Y
heap.add(new Node(min[1][nxt], nxt));7 O' Q5 a7 B5 o
}
) \7 ^, I& N( O M7 t% |/ W9 o }
, d0 v3 o2 e3 L4 }3 q }& c/ ?8 `6 H2 v4 {
return result;) q2 g8 A$ F# S4 L# @) [; W
}9 K N; C8 a+ c! [# m9 j# y1 I' n
I5 z2 ?7 [& v5 T" o- F
private int waitRedLight(int now, int change) {
# J0 [' |: w4 }; ~% {( p6 R4 K2 U if ((now / change) % 2 == 0) {
4 i+ x8 [) X+ m% k$ g$ `7 Z- J6 S; Y return 0;6 Y% k/ Z" x9 |. g
}
9 P/ H0 o6 m9 m6 q0 u return change - (now % change);
1 X% i4 L% W# ~ }
P6 k% K* w o1 U7 T7 u; @& F} |