登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查句子中的数字是否递增】
; c' M9 p' D5 a+ l, ]# o' k% w( p& A: z
解题思路
0 ^% m) T# O/ {3 J签到题。
5 Z0 A7 w) X% j# |
' Q9 c, F" ^* a" \( f代码展示, w& @+ t: J+ D3 \6 n
* @1 ^/ e! S; ~) A9 P) L- |! G" u) R$ c
class Solution {% z5 J0 B. t3 F4 F
public boolean areNumbersAscending(String s) {
+ F" y0 S' B9 i/ k& u0 { var strList = s.split(" ");
+ ] q- |6 G& \0 J0 S4 d int last = -1;
; R# {5 a9 M3 f$ V4 }, Y& |. Q% v for (var str : strList) {1 q3 j" B; B- F6 }7 q) j
try {2 L4 g9 U; @1 B. [
int num = Integer.parseInt(str);" W( E7 i! R5 [: {0 \
if (num <= last) {% p9 U! K0 k7 B& m8 Q
return false;
) l& ^8 [9 T! t* D: u g- } }
! n1 z) U) ^4 m+ F1 J7 B last = num;
. i3 f+ ^/ D5 K, U } catch (NumberFormatException ignored) {3 s; `7 W$ A1 x' S- U6 f
}# ?' p+ d% ?9 A) H1 R
}& U2 G$ P+ h0 y, ]2 e! K
return true;4 F$ E5 h5 c$ V0 V& z/ E# B& ~
}8 y6 B: K+ {2 @1 Y8 y
}
- z9 q* |! _% R; e0 H/ X b' P! X% u+ r( [4 h! c
+ M( ~6 i9 H- @- {1 E
【 NO.2 简易银行系统】
) m+ a# k/ o! l# D6 y' D
% c6 t$ D6 y& B5 a0 I解题思路# j3 \/ N( F( c$ w( C1 z
约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。
2 m' ]1 X6 D9 d# @+ M
: a9 l! J! T( v0 l代码展示3 x0 [$ f b3 y8 _* c
# R2 f. F( Q8 p: U+ Q
class Bank {1 Q& y& `2 ?! @# P9 W! Z7 ^
long[] balance;
# Q; R1 ?# I3 N7 A0 X$ E$ d9 r" X public Bank(long[] balance) {
" P7 j+ \2 a4 N/ [& Q0 P6 l this.balance = balance;
( ~* M4 E0 Z# V( ^1 G$ k! U }
. g; Z1 w6 }* u7 Y0 B/ x
8 j, E; E( d/ }0 ?; {) ~0 O0 f; r) o, a public boolean transfer(int account1, int account2, long money) {" a- X2 V( g7 K7 V# z6 g/ E
account1--;+ V. Z( c; x% h* m, l* x
account2--; w. m. b" V! `2 A ?
if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {# O/ m0 ~: s; d8 o6 h7 g
return false;
$ T% L4 w' R( l; e! ~; \* N- m6 j }4 M: z' j, ~/ \! }
balance[account1] -= money;4 l: s: [4 Y% M1 U1 [
balance[account2] += money;4 r' e: r( p" e0 O; x3 c1 Y3 |
return true;! e) d9 ^0 F% c( A
}
* d8 t. }$ K. m* S6 ~8 `# ~3 U. W+ t1 l; {' X/ R. N
public boolean deposit(int account, long money) {
( R! G9 g! d" V1 l3 P b2 Q account--;3 Z7 U- @+ h& b8 R
if (account >= balance.length) {2 S0 b u8 P5 L c+ E5 a Q
return false;
0 ~) S/ O8 W3 y( b1 g, L/ p }( c8 Z* ?& N' d# c+ R' U- A
balance[account] += money;
$ B7 _0 W# W: J' E2 b3 @" G4 U return true;
7 A$ V" D0 B! W+ z; U# v& @ }
% Z9 c$ A ]4 ^( _2 k
! \, A' \8 v) J$ T public boolean withdraw(int account, long money) {" w0 L: F( U7 ^+ G4 Z' L
account--;
: j) ~3 n: Y5 ^ j5 t0 D/ L j# ~3 z if (account >= balance.length || balance[account] < money) {
/ O1 H( d7 z" ]7 b) S% Q1 n r return false;% Q+ O. }6 P/ f. J; ?: d5 O1 P9 h1 g
}
2 Z r( {$ }, L1 o5 T* H- K balance[account] -= money;
& z& Y& u% G, Y1 M( N4 [1 R return true;
$ z5 p* ?7 s- P) V7 i }% {: G2 g+ w6 s( e" n, @; b# L
}
% Y1 J! G, x- J4 v( k2 x C3 e* x; W2 ~
S' h) L+ g2 W! l0 V【 NO.3 统计按位或能得到最大值的子集数目】
( h. [& q) }3 ?7 j: l6 k4 E
% r4 f% A {6 y3 |3 {, d0 u3 W解题思路! n- @- l) Q: R& B8 y7 G8 M/ k
数据范围很小,枚举所有子集即可。
0 k) F( L, P8 J1 t {
$ p R1 k- X& P7 ?% h" y代码展示4 X- s6 V3 c ?& N" C9 l1 k
# p) W* F, u: g
class Solution {
* t. B2 J. h x% k" C public int countMaxOrSubsets(int[] nums) {
" u7 y) A: K% p int max = 0;
$ u6 Z. t4 C2 O* h. D {* N# l for (int num : nums) {0 w B+ p. ^" M0 b. f7 L
max |= num;+ o3 _* x4 S. j5 B) |. e& ]9 o
}
r' s, o J5 A# d5 E5 q6 n q( l: D int res = 0;
( w |$ r& C1 f/ T. r. O for (int i = 1; i < (1 << nums.length); i++) {
0 Y4 P+ d) ? ^5 q int or = 0;
+ x) |% D# V* q for (int j = 0; j < nums.length; j++) {+ z, e1 x8 W* {6 k( C3 b6 S
if (((1 << j) & i) != 0) {
0 Z1 V9 i3 V9 F or |= nums[j];
% `2 Z* u+ ~% z7 {! _ }
6 a, F. s3 ]- ~/ ?& {! u i& u% [ { }
0 H6 H5 g' n' p% ?# Y( F res += or == max ? 1 : 0;
- w$ J: o: {0 |! N5 B$ T: U }
! C. _% s" l2 Q" `: Y8 k return res;
d$ h3 q# Y- V# S! \ { }
$ P) ^, a8 C* `9 X( m2 b}
! `5 O9 u$ i$ M8 c
1 k( q# W2 K: m" y# O' N) \
- T% K- {+ S- |【 NO.4 到达目的地的第二短时间】6 h" X0 |1 I* Z( O8 v
; @# {0 [3 j! W解题思路
7 {# h1 X0 R! n& C7 ~- Z: S1 @
3 s. U) O" B, T& l- m, j9 M* cDijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
1 u& ^9 }* p* x; v4 F* I
* J9 X: G) c, ]代码展示
/ b3 a5 f5 x$ O# R2 F9 x& X/ z; z5 }& G7 b3 ^- \5 m$ u
class Solution {
_3 C1 t" _% M; t) C/ _" p" k; I static class Node implements Comparable<Node> {/ K0 I9 X- L: F6 P4 z
int min;/ `; R& @: B; ?0 N* E' U0 y
int idx;
0 R3 @ R& s" |8 |& g5 [: I1 Q- V2 x* C( O B0 o3 j! j
public Node(int min, int idx) {
4 f7 ?$ }8 v) ], v1 v this.min = min;8 E: {) \. J% }" ~# V! ^
this.idx = idx;6 n; Y3 W2 S; D: [
}
8 i j% E8 I" s$ i
7 w+ k" O+ f% [1 Q- @ @Override
% K2 A0 p; |, z4 q' k public int compareTo(Node o) {% I' L$ Y7 y( g2 [* q
return min - o.min;
# |( w- T# T* }! F }& A `2 Q, b$ V y
}# m% ^+ V9 r1 _5 d" B' \
, N. W# m+ G1 t$ z) L, V& E: Z+ `
public int secondMinimum(int n, int[][] edges, int time, int change) {/ N3 p' }- S) S. ^1 v9 D' L
List<List<Integer>> graph = new ArrayList<>();7 E' j* r7 Z5 w8 u+ V/ |4 e: M
for (int i = 0; i < n; i++) {- L, J' C2 c2 }; n' Y1 h: D
graph.add(new ArrayList<>());) S! }$ o" s. f; {
}
" E# I+ `4 B# w/ c/ X( y for (var e : edges) {
! `: \8 x8 }' _+ j+ e( { graph.get(e[0] - 1).add(e[1] - 1);
& U3 D: V6 U1 E" L% L& s, t" |0 i( X graph.get(e[1] - 1).add(e[0] - 1);
' C* w) n' r, |- t' u0 s: ? }
# ~$ Q: H; l5 K9 B- w- _( \/ P, A1 Q* J- r; o" m
int result = 0; // 最终答案, T& r( {5 Q; }
int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)/ l1 y% _" w( m
Arrays.fill(min[0], 0x3f3f3f3f);
: f/ J- y: T5 z8 ~5 I" ]' c1 | Arrays.fill(min[1], 0x3f3f3f3f);
9 B8 l0 K5 x+ s6 p min[0][0] = 0;
e2 v" D# W" Z8 W \- h [4 X PriorityQueue<Node> heap = new PriorityQueue<>();
" i0 J Q0 y* ~4 W1 x heap.add(new Node(0, 0));( M A; U, T$ ]! |6 H
while (!heap.isEmpty()) {4 h0 A) S( Q. j
Node node = heap.poll();
/ V- s$ t2 G, ~9 O& i4 W if (min[1][node.idx] < node.min) {
7 j" `4 u* T8 m# V% r& d/ P continue;
; O6 e, x C+ q* [) {! K* Z }
- {& v! H- s: B4 a& r for (int nxt : graph.get(node.idx)) {" }: _9 ~2 U' U# _5 S( O
int nxtMin = node.min + time;9 ~6 m, c" k! L2 B E+ @! O
nxtMin += waitRedLight(nxtMin, change);7 [& Y9 W! X/ M" c
if (nxtMin < min[0][nxt]) {4 l4 t( n% T3 X8 I4 A3 ~
int tmp = nxtMin;7 H! p# _. {: K) ~% i" K+ \7 ^- L7 {
nxtMin = min[0][nxt];! ~# t# v. e0 p
min[0][nxt] = tmp;$ Z( j0 |* M$ a) S$ K4 H( O
heap.add(new Node(min[0][nxt], nxt));
" u. E5 G! D: m% ]3 i: u, C( Y }
8 z1 G, l! u2 V8 y. L if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
# W$ T2 C2 I" f if (nxt == n - 1) {
6 t- q2 a2 B* C E& o9 [ result = node.min + time;
& `# K. M& E- n% G }, c2 C+ L# s7 m6 L9 S
min[1][nxt] = nxtMin;
. @1 X* f9 J+ P* Y heap.add(new Node(min[1][nxt], nxt));: _6 y7 L# H R
}
. c5 L9 J+ H' E L- e9 V0 d' d- { }: A8 u3 N }( N$ W
}: T) K9 b3 t/ \" h; Y0 s
return result;
v& Z. W5 {# V8 U3 ?- d' D3 p }
4 M0 w- o _" O; |: N8 r
& q6 ]2 j( w8 ` private int waitRedLight(int now, int change) {
% r! `, o5 i( }# e) F- z if ((now / change) % 2 == 0) {
+ u, @1 ? |1 W1 m% \ return 0;
$ M7 } i' p% b* K4 E5 T8 I }
& [- z( V: ]$ Q# Z return change - (now % change);9 k& {* B- P7 L7 b1 X% s: n0 G
}
3 T0 Z2 ?% x- e} |