登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查句子中的数字是否递增】
6 ^! n j7 K9 C6 m& a" B& e2 K y5 v$ t. D4 n- s* q- a3 e# a, S
解题思路
, r; w1 V# w4 y* O+ _ e签到题。: z/ D3 d( C( m' k, b# t
" P' a8 q2 P+ D) w代码展示& L+ }! r* M- q1 ~- Z/ k2 y
8 _7 M0 V+ G7 J8 x
class Solution {
* h0 P* A; y& L) J! ~$ ~7 `6 P& _ public boolean areNumbersAscending(String s) {
% g$ i. ^/ [- m4 q& a$ c var strList = s.split(" ");
) r- y( d) Q4 B# V# i' x( q/ p int last = -1;' \! N2 y7 u9 s
for (var str : strList) {
3 t. D! Y- c. t6 s. N9 P {; \ try {( I2 f& ]6 e% k4 K
int num = Integer.parseInt(str);: d1 [% {& U& M$ @
if (num <= last) {# \ I8 Y6 W) u" `9 A
return false;0 B: \! Z# t* {+ ~% |
}
/ \: c9 l2 [ r5 f( c, Z* _ last = num;' Z' e$ g: K4 r1 x! A
} catch (NumberFormatException ignored) {
! W _' `3 J; v7 Y }
% o5 Z% ^9 H$ \# ? }
+ u9 R8 S8 `8 [' b4 g2 r( {8 X$ ~ return true;! Q6 z' I2 Z @6 H
} z' ^* p1 d3 f( x; f1 N# M. s( _
}" N( r! c$ ?; D& I! _4 a
& N- O" t+ i" e- c& M7 t
. m0 t0 y6 S1 W, K$ A【 NO.2 简易银行系统】
! I, n( L8 R, m! g8 c8 F4 B2 R( }$ a9 i9 |2 l9 F
解题思路' j8 S9 y, i: a( d2 Z+ |
约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。
. D5 C' x$ `8 I* T" ]6 {
8 w1 M; }, H' b" o \代码展示
9 i8 W5 q+ P4 A# C7 V/ e5 P( k N3 ]* r& m+ O( [& X
class Bank {" v9 b7 B9 O5 q( l/ J1 V
long[] balance;
% i# ^+ B% h( `! k6 c public Bank(long[] balance) {
( P( r7 I$ S) A' U9 r: W this.balance = balance;! O0 x; x6 d( Z- H$ _
}* n S. T) |+ I# \2 c
3 }; I+ Y% a% Y9 U6 I; h! ]) ?* z
public boolean transfer(int account1, int account2, long money) {: ^* _0 y! F7 N) N
account1--;3 d4 W& q/ t2 E. u' y# e
account2--;
3 r4 n/ y: G( }- w if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {
" R( F6 I$ m1 H; X return false;6 s) c% t, P7 M& o1 g
}/ } ?! S( T& z5 c
balance[account1] -= money;# W! z. t, i7 q4 d
balance[account2] += money;5 M5 W) }, K. \* u" H- ~
return true;
- J K; R. W. `7 K; c3 s }
1 B& T8 B( [$ V! {2 b g4 S
$ [% E2 F; ^6 b. T) `' k public boolean deposit(int account, long money) {2 x% s; [( S8 ?! z& c; A
account--;
P' M" x/ G, N if (account >= balance.length) {
* f6 y' j8 z! H( T5 U return false;$ R) n0 P! N6 r' T% ~
}) }; O# ~9 O2 g: b# ~
balance[account] += money;( {6 q+ H4 O6 \2 Q2 {# t
return true;
2 p: W2 X- E# a5 \4 [2 \8 ~ }7 z" S3 t. ?2 J J( D3 h- x' U
, p( }' D3 T+ A1 P& G) t4 B2 ]3 Z
public boolean withdraw(int account, long money) {
1 _3 c# R4 n6 Z! d+ |( e1 R, R% `9 n A account--;1 T8 k5 c9 Y' t2 I
if (account >= balance.length || balance[account] < money) {2 w5 V, g2 w/ a* p" Z* k! g8 b' A
return false;0 S$ U6 U _0 ^
}0 t& J& ? x; s- D* D
balance[account] -= money;$ I/ x! j+ H& P# b
return true; q' C! @( i: T, E
}# P/ u$ F* X( i2 @
}
- n. w! Y1 O4 H( K# i) a# g; ~ Z S
- u2 n* r3 u& f3 z
【 NO.3 统计按位或能得到最大值的子集数目】
7 ], z- t2 h( }9 H" ?& p
" S( O/ x6 g. T! u( \8 M. H解题思路
. [; W" v, m" ?: t2 Y: u1 [数据范围很小,枚举所有子集即可。
6 ?" A& f+ S, b2 I# P
5 Q2 n- `. q* @& O" y; y代码展示& e1 Q. c2 E! D
; i& S) Z8 a* r# D2 H9 Z7 N: z3 X
class Solution {0 {( B1 g) x9 D2 R/ \4 [! r+ U* F, C
public int countMaxOrSubsets(int[] nums) {" r6 A# j9 d2 |" {
int max = 0;
3 j2 \$ L3 _$ B) r) }& L0 W for (int num : nums) {
& r# m2 `3 u, g- ?/ i max |= num;
$ v/ P* K/ c. Y* U5 Y }! ]$ ?9 q0 F1 R! G9 r7 V- q. X
int res = 0;
9 f: L% D. p/ r9 v Y for (int i = 1; i < (1 << nums.length); i++) {
2 q) y( h$ F6 F" J int or = 0;9 {% o$ f( V1 q+ x2 D
for (int j = 0; j < nums.length; j++) {3 e/ I! k- X( ], v' X4 F- G! n
if (((1 << j) & i) != 0) {
1 H# Q0 Z4 t% Y) ?& K% u' x or |= nums[j];
+ y6 x8 A* T0 a2 l" _* G; X _ }
2 Z- M8 b( }5 ?: C0 Y* j2 O }
4 B4 D' {' R- ? q res += or == max ? 1 : 0;
" v2 w( j- j+ U( [$ r* t, [ }0 \! f: H$ J! D0 O/ B, s
return res;3 O5 K0 ]! S! S0 Q8 R
}
3 O) [, q* v2 ?0 z}
. o4 Y Q% p/ t. l5 t" X* z z# h& e
2 H- C7 X) @* O/ {& v! u
【 NO.4 到达目的地的第二短时间】
, [- q6 q% R( Q, f) V+ t
% X3 _# p+ |* r1 p! k. f6 j( e4 n解题思路
, M4 m4 `( G8 G3 h6 @0 y% Y
2 p' A% x+ D: x# k2 B5 w- nDijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
7 a7 _5 n+ N5 b
2 s3 N* T6 \6 E0 a代码展示
) w0 c W8 m8 D! Y0 |7 C) u. N) ^1 K2 O4 }# u
class Solution {7 k/ f+ H6 f& b3 h6 z& p, n
static class Node implements Comparable<Node> {# w, y1 T" k2 K( ]/ ~& _+ I
int min; l0 t, u" ^( e8 V1 w0 J1 v, C
int idx;) v L; y" w; F8 c* d9 @
4 V0 O# u$ F' B3 e5 Z2 U: B public Node(int min, int idx) {4 g+ L8 V# o8 b1 C
this.min = min;
/ @' B9 i, x3 G this.idx = idx;8 K4 |1 j8 |4 x- v/ R# G, _0 S8 v4 D
}9 l* a6 R3 K8 y. o+ _
! Y- N7 |! W, g7 Z @Override
6 g4 n; G2 m/ Y7 G4 z8 U public int compareTo(Node o) {& |8 y: p/ A* g/ l
return min - o.min;4 S/ H* b) k! ^8 ~
}+ ?& Q* b8 I( h4 `! ?+ P2 G
}) V6 T8 N% P8 H- `
' X2 U9 k$ A! ~: b
public int secondMinimum(int n, int[][] edges, int time, int change) {. @, ~4 O. V: p0 k# H
List<List<Integer>> graph = new ArrayList<>();
/ O) _: O F5 m for (int i = 0; i < n; i++) {0 H B& t8 p r
graph.add(new ArrayList<>());9 h- S9 @1 `, F
}) v' c6 V. D( V0 [4 p# ~6 r5 y" Z
for (var e : edges) {5 }: V5 m- h& x2 C& T8 h, C
graph.get(e[0] - 1).add(e[1] - 1);: _# a9 [) m4 i6 H
graph.get(e[1] - 1).add(e[0] - 1);2 m; J* e" k3 Q8 l" \+ t
}% ]9 _) H7 Y5 j4 F2 a U' e
' X# N w; `4 R int result = 0; // 最终答案; k0 v- ^6 `: F! ~" N
int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)( P. v5 Q4 a n* q
Arrays.fill(min[0], 0x3f3f3f3f);
8 q0 I/ Z) V6 u1 O0 f Arrays.fill(min[1], 0x3f3f3f3f);
' Z5 W# n) K) i5 S m p min[0][0] = 0;2 c& x1 j& K9 t/ i) s" o7 h
PriorityQueue<Node> heap = new PriorityQueue<>();
2 g F U+ S$ d# E, \) K* l7 p heap.add(new Node(0, 0));, c: W" s; e6 L
while (!heap.isEmpty()) { }* o I0 n) M+ A% Y
Node node = heap.poll();
8 I+ R' S M. |& C+ o9 K4 t& S$ @ if (min[1][node.idx] < node.min) {
; g4 Q8 k8 r, C) O. P u! }7 i5 P: N continue;
+ |' p$ i) _9 A8 d& c% l }6 n1 T' B: I* ]
for (int nxt : graph.get(node.idx)) {
! O, Q& B9 ^" q% ~2 `% R int nxtMin = node.min + time;
8 O# B3 [$ \ k nxtMin += waitRedLight(nxtMin, change);8 q3 [& M1 ?9 P$ W7 _
if (nxtMin < min[0][nxt]) {
+ v& h+ v% Z" ~5 t' t% E8 X int tmp = nxtMin;8 w8 V/ S9 B$ G# e Z6 N5 a
nxtMin = min[0][nxt];
, o& _0 h+ x; N min[0][nxt] = tmp;6 S9 o- S4 i( j5 a4 n$ E
heap.add(new Node(min[0][nxt], nxt));( U. a W, N2 D/ w$ n8 R$ {
}/ J" L7 I i* b
if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
6 x: ]- O) V# I+ I4 A1 i if (nxt == n - 1) {! t$ X( P+ o( ?
result = node.min + time;
1 ?7 ~1 i- b$ B4 u- y# ~ }! D2 \: I) L% ]5 I4 W$ ]+ n g. m
min[1][nxt] = nxtMin;" k4 }5 _& O$ q% e+ j
heap.add(new Node(min[1][nxt], nxt));6 }# E' j5 X ^% O% T2 G) {
}6 p+ p8 q1 _( g" l; e
}5 [; D) ~2 L: L
}, }3 H p* V% Y! \6 I
return result;* X5 v: q4 E6 P2 l, o" P2 f5 S
}! T5 N6 A/ G7 I- G% L
3 A; L7 `3 h& M* l$ g, y
private int waitRedLight(int now, int change) {
4 R( i) J4 Z6 m9 ?0 i& x" p if ((now / change) % 2 == 0) {' F( @" T; d8 w3 D- X- [. K9 E F Y5 u
return 0;
( y, V& G( Y3 l4 F }" e+ v m. I$ w' S/ e
return change - (now % change);
/ O+ v6 W; w# H4 A7 q& @ } K3 Z4 D# J, F
} |