登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查句子中的数字是否递增】7 U$ \5 Q8 s* Y7 r9 O
% v" h" n$ o Z* M" z, C
解题思路5 E% _5 T+ a- c4 ]+ u5 H1 D
签到题。1 V# ]2 e, o8 ^% I% l+ A
* f' c" n$ m. |3 m
代码展示
7 Y( W/ y1 k/ _0 a0 J8 J' m& K, b: i" ~! N4 d$ C2 }' K! W
class Solution {
9 T E. p; g5 O. }2 Z public boolean areNumbersAscending(String s) {2 n4 v4 e3 h# U: _
var strList = s.split(" ");
( U$ [+ V" D6 f( U8 L+ e6 P int last = -1;9 X- N8 s) y% W G+ K
for (var str : strList) {
/ v3 e3 l9 ]$ X" g3 j6 z3 y* f try {* |0 g5 _( m2 X8 g
int num = Integer.parseInt(str);
( N5 j3 [2 B* i6 V if (num <= last) {
- G0 r0 a% e; g3 u$ t5 } return false;
/ t; j& k. {1 @( ]9 p% r }
/ ~* C& H4 E' x: W, f! [ last = num;
- V! {+ Q9 x' A } catch (NumberFormatException ignored) {
1 b7 R" w3 w! M' @1 N/ R8 o" x }
1 p! `8 q# r$ p3 ~+ M2 j9 m }3 m( i3 W* Y$ E; o# J
return true;
% S9 \8 k: h9 m7 }- N) O; j! a: Y0 T. u }$ _# {" C ]! T' G. Y6 {6 ]
}- s0 c' D" {7 b) U% d: g U' W
3 ~0 ]3 y7 i( p
8 Q' o) b! j/ Y【 NO.2 简易银行系统】
6 k8 P+ p' M4 b- d
/ e" b; J$ P8 m解题思路
$ K3 A8 C" y# J& y$ N! R( w约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。
$ }5 a' B" d* y( h9 B$ A: Y8 J$ V3 j4 v# l7 W
代码展示
+ m; y. r: Q% ]/ v. D5 ~5 |. N) ?) Z' ~
class Bank {! u# k" n' {9 m2 ?
long[] balance;
% g% R1 s# u+ I8 t: J public Bank(long[] balance) {; ?" U; ~. _! R
this.balance = balance;
2 @" G( E- a( U$ k! N0 L }
+ E0 a6 M( \( Z/ m4 F, |1 G% P5 h# a: P2 n+ \
public boolean transfer(int account1, int account2, long money) {
3 t9 P) q$ T/ g# F0 L account1--;9 B- [+ b7 w7 B) x
account2--;# s3 |% _- g' |* v! Z" a7 D K
if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {
+ F2 L2 y$ \. k+ h return false;
' @6 Z/ [, g$ M( V/ U( k# F }
/ u0 H* S$ C2 Q+ M1 H& C balance[account1] -= money;9 m9 [/ m+ ~% Q1 L; H6 B& c# N, X
balance[account2] += money;
+ Q. e/ r2 s7 r2 ?* G* r5 j& D return true;
4 r0 o6 @' ~0 I" O* k5 u }
3 ^9 Y- S) _+ f% r3 t4 d
3 D9 R1 [: u% K3 w" l public boolean deposit(int account, long money) {
. v" U; U1 d; W1 Z account--;: O& L# t. n9 H1 \5 c/ F; X3 U
if (account >= balance.length) {
6 w' {. m) y+ Q! f' h return false;0 l2 S* _* N1 H g* p( C
}( P& E6 ]5 |) o1 `
balance[account] += money;
3 F, W! {1 O" m$ e return true;
' a2 n% w) Q- h! o* e }/ L0 _ D' W0 O8 f
: V( b. d# O- v. }; h2 ?! r& C
public boolean withdraw(int account, long money) {7 F l3 ~+ y8 ^& V9 i; |
account--;
, i; Q+ [ M2 X. D+ C; _) P1 G if (account >= balance.length || balance[account] < money) {; i5 C! }2 Q7 ~ c, E# n
return false;
/ H. B: o6 v9 l# ~ }
7 ]4 a' x. @$ ^3 w; ^' b balance[account] -= money;
- _5 O. z! ?: _% V2 O" N+ I return true;
* k; |4 t* |/ N" b9 t }7 w; n3 A, N# M/ |* W
}
% _0 ]" r0 E, c8 R" ~# @$ _8 O- a+ G, C% u
: j6 e' A7 a9 U. r6 D【 NO.3 统计按位或能得到最大值的子集数目】# v3 q; G4 Y7 q& ~
5 e9 L" v+ M4 f1 b# u解题思路
+ C) @/ y5 q: E% {) F数据范围很小,枚举所有子集即可。& k3 T2 h0 k b
" i! @1 ^* w6 y
代码展示3 \7 K J! @: r1 X- M" I
$ j2 _ {& {2 A8 R
class Solution {8 I$ @6 l1 [% S3 J: X
public int countMaxOrSubsets(int[] nums) {+ n6 g$ n3 z4 i' V
int max = 0;
2 b! |6 K5 X' c: @ for (int num : nums) {
0 ?( h. l8 q& E3 d& w max |= num;
0 M0 l7 D2 ]9 B3 W: O- L }, X2 f+ M% P6 q6 o# i
int res = 0;
' ~; O' c) @! o* E* z for (int i = 1; i < (1 << nums.length); i++) {
! _9 g5 R6 |0 q# F int or = 0;
# ?/ b& i( c' R* ]2 b, e* W3 a for (int j = 0; j < nums.length; j++) {
0 J0 g3 _0 n+ U) g5 `' n if (((1 << j) & i) != 0) {
1 C7 T4 W4 f- V1 m or |= nums[j];" v2 e X8 _% d& L! r2 t
}
! U2 ?7 P) O) j X8 F }' m* R u1 B& C% ?) |: | S8 f, F
res += or == max ? 1 : 0;1 A; h& P! H# X( O$ s
}
: Q# [$ y. T1 i) {" q7 x" g1 _ return res;
( G" } ?/ `) {* b9 w }* u% |' ?' k8 ^. E
}
+ x6 o- I, S( g2 R7 y4 V6 W9 i* \
# a8 a$ ^/ W I' X! e( p
【 NO.4 到达目的地的第二短时间】' h* ]. o7 ]5 D" D8 B5 m: L8 u" y
2 @& _! S" y% k& {* X( \4 a$ X
解题思路
4 g, ^/ L! _& H8 t4 s, `' p2 u1 z) |+ \3 H8 H; O4 K% h
Dijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
9 w0 d6 g* y1 d! b% @+ F, k4 L/ I$ j5 {" r0 t" ~) \8 j
代码展示
9 r/ F& G; @$ o0 l4 ^; ?* g( o7 b7 m6 ^% a1 m
class Solution {
( T# A4 J5 r/ j2 e) ? static class Node implements Comparable<Node> {
+ m6 q# B; o7 G: | int min;. ?$ V9 z& d% D: n
int idx;
( w# z T5 V* Q" |$ N2 j# H( \ {9 j2 ?+ J m
public Node(int min, int idx) {
. `3 @9 k5 W8 b" P this.min = min;
, x. r( p- l9 K2 m- p this.idx = idx;
# g; V- |% o& y }4 J& k, s* ]% t: F' [/ _
) l, d# x4 E+ R6 p8 [ @Override
/ A! M0 l( D. A& c! M3 a$ K public int compareTo(Node o) {
9 D" E8 w6 a! |% m, x return min - o.min;0 }- m) L, q* Y; }+ d% p. C) {3 I9 Z
}
( o1 y) E7 x* m0 n }3 y9 a, s% M# i$ D2 t4 K, h
' w# I: H2 ]2 r4 D public int secondMinimum(int n, int[][] edges, int time, int change) {, u5 e* _5 W% D6 S. g/ ]& G& }$ E
List<List<Integer>> graph = new ArrayList<>();% N, I) O- B% t5 u( w; Q
for (int i = 0; i < n; i++) {9 p1 O$ R; b7 J" \( |) O# G" w
graph.add(new ArrayList<>());
. E) D1 B. p& D. ^) J1 @ }9 N2 Q& ]2 u \. M. r8 u* G* m& j
for (var e : edges) {* R0 M+ ]/ u- }! K* Z, E
graph.get(e[0] - 1).add(e[1] - 1);9 H9 K- O% s: p6 y) j* ?
graph.get(e[1] - 1).add(e[0] - 1);# q4 z) J0 V; W- J
}
7 W% S6 H I# e" P! z( e2 f0 M7 C0 _% C
int result = 0; // 最终答案
( a, k# i8 _4 K' k int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)3 r" z& o, ~# ~# w
Arrays.fill(min[0], 0x3f3f3f3f);
* L7 o7 a7 x7 y ~ Arrays.fill(min[1], 0x3f3f3f3f);
7 [8 U5 z2 h% D3 g- m min[0][0] = 0;: b) `: h+ z8 r, v# U* {
PriorityQueue<Node> heap = new PriorityQueue<>();
; \; I1 T& ~ O% W5 J heap.add(new Node(0, 0));9 v, |% G, |2 v8 f' _, ?
while (!heap.isEmpty()) {
+ d; N% X" ~5 ^4 Q A L& P" r7 Y Node node = heap.poll();# y( A- d- P7 i
if (min[1][node.idx] < node.min) {
8 Q; F2 i# x+ r$ f2 q8 ^ continue;4 c9 o! e0 n2 W8 i) H
}
9 @% G( H1 v' P! k* d3 |" o% W: | for (int nxt : graph.get(node.idx)) {
0 M: y: z3 {2 `; o) q int nxtMin = node.min + time;5 W& J" M; Q& {& r
nxtMin += waitRedLight(nxtMin, change);1 U( R6 h" K3 I, D
if (nxtMin < min[0][nxt]) {
- ~# y! Q3 x: B/ ?7 U4 b) m, e+ R* W int tmp = nxtMin;
3 p F+ Z0 ?! e* k' V nxtMin = min[0][nxt];
4 [: Y! s( u9 ?1 p# L( Q0 s9 E6 D min[0][nxt] = tmp;
8 v* V9 U7 q6 k heap.add(new Node(min[0][nxt], nxt));8 b* c! P8 b- q8 ]
}6 [ D2 Q# ~7 h, y. D
if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {" ]$ t6 \& T x0 n
if (nxt == n - 1) {" c2 s- u( e5 o
result = node.min + time;" r5 }9 J6 {# a L4 |3 x' Z
}
* l- }9 Y2 b1 J, I# c1 n; O min[1][nxt] = nxtMin;, \6 k) e8 R' ^/ ^: O
heap.add(new Node(min[1][nxt], nxt));
% T9 d# _( _8 A2 ` }$ n. s0 _0 M7 x& v, T p
}% N+ ^( K% L$ a# T! d3 z8 d
}
/ t: |" _; O+ S& W' \! X4 q( d) S return result;. u \( f6 M5 C& J% W
}' K- q5 M0 N0 G
( [ t+ v. V, C H
private int waitRedLight(int now, int change) {
' {! W# b/ Y5 d' P6 P/ L- } if ((now / change) % 2 == 0) {$ M P" P2 B: t; X! \
return 0;' x2 c/ D- x5 l
}
: e! R. a( H& }3 v+ o9 u, V return change - (now % change);5 z6 ^$ d! W! k; P
}
6 e; _/ H( l& a: e' ^} |