登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 检查句子中的数字是否递增】
& ? S$ {0 n3 Y* D5 E
' @, B6 e4 |. ^+ M+ h M& ?; h解题思路! D; z. ?- m; c ]6 H6 H: |' F f: c& J$ D
签到题。
: G5 a- H( b7 m, N* V. E/ P
* c; ?+ Z, z/ c- R5 V8 P代码展示7 A& Q/ b$ o6 {' [2 O
3 r! z! ~, O- s4 T {5 v9 X
class Solution {
; ]1 a2 a& l! u! g% `- P* o public boolean areNumbersAscending(String s) {
: G6 s7 v5 o# n, O$ u( _ var strList = s.split(" ");% _. B7 L9 G- s$ _ ^! V
int last = -1;
4 x7 y$ ~# `$ @2 H& u# J" S* d for (var str : strList) {
' I# M h2 X1 Q1 | try {
, M& y% F5 S! F% o int num = Integer.parseInt(str);; @7 G6 O1 F5 n( s/ m
if (num <= last) {! a# W! R; T5 U* ~
return false;- k, |9 U) O9 Y0 W/ m7 S
}
; _6 a2 l$ x, C5 [- p' u last = num;
9 O) M/ X8 } N) d9 i4 S } catch (NumberFormatException ignored) {: q2 l5 Z! ~1 N; S: O# m! h
}+ J: C4 n- q2 p* ~8 @
}1 K* X! p( @6 ]9 p2 r) } R, n' u+ ]
return true;5 d3 r- _1 t( d
}
+ ^- w& [. ~* L& r( f}
6 s$ S. V; Y; |
" h5 g( D" x+ t- w
7 B* }- A- }% c }4 P" r; D* w9 T【 NO.2 简易银行系统】* |" S; V* W/ p2 M2 v5 ^- {' f
! c& U* G P& L5 D解题思路
8 ?7 W0 O% K. p5 O+ ]: c2 D约等于签到题。如果题目说明 “可能多个人同时操作” 还好一些,那就需要加锁了。; N/ a2 c) j+ X
. R3 x. q& q6 L2 d) y代码展示
$ \" M' N0 q, q# G( b& Q6 g! J3 m% B; P' @9 ?
class Bank {
$ Y6 B7 ^0 u3 a2 {6 Z$ r long[] balance;2 P. [$ k7 X {8 n
public Bank(long[] balance) {% Z u* ~: `2 t$ v
this.balance = balance;3 ]/ X# U8 H! p( D
}1 u. L* p9 e1 t) z5 l/ V
2 ?; q: F9 Y" W
public boolean transfer(int account1, int account2, long money) {
) v; W$ M$ q8 g% j account1--;
7 `0 x7 V$ l/ S0 v account2--;9 { I0 U4 S& e8 {
if (account1 >= balance.length || account2 >= balance.length || balance[account1] < money) {1 \; A1 [0 I2 W* p- ]# W5 o
return false;
% A5 d9 x% Z7 p; t" Z2 \5 [9 E }( N; u4 X( R8 L1 T8 ?: M2 b* \
balance[account1] -= money;
2 S0 T. w- u6 }& l9 r$ j balance[account2] += money;$ S; f) H% N" m4 D6 a q
return true;! E& A/ _, y4 K6 q9 U
}
! [( _- w2 |# N4 m
. F" j7 W( P- R* Y public boolean deposit(int account, long money) {
2 A4 W( x! ~" t& n3 l account--;# Q9 f( m7 c/ ?" m# R4 w* [
if (account >= balance.length) {8 G' W3 x8 I% m' l8 u8 E+ y
return false;; ^/ {: \9 T- T& W
}
% T: M& X1 b4 Y) X balance[account] += money;$ J& w. F8 L ]* f
return true;' P( R( z, m* q9 C0 w
}- ]9 S, b+ F7 X* t5 W4 L9 [
# k+ u9 q B$ `- w9 | public boolean withdraw(int account, long money) {/ [! j2 g6 A. t. b5 J1 i, S5 m% g. W
account--;
% L+ S% ]6 o; R ~8 a! y if (account >= balance.length || balance[account] < money) {
j) u5 M$ `! K0 N+ y* m9 S. R: x return false;
7 M H$ u3 i5 \& A0 F" } }2 C! ^) ~2 k- U) B
balance[account] -= money;
6 P( K$ G' O' {/ V* W return true;
" p2 F p5 W1 s9 Q" k }( k4 i6 ~$ |9 Y# {2 a3 F2 C9 |
}! c! e) O% R8 T$ p; V3 h1 {" Q* _9 `
: [! ^4 T5 n+ o1 [0 J- G# T7 I# }
【 NO.3 统计按位或能得到最大值的子集数目】+ c! B' J$ c+ L
0 x7 Q9 D7 j7 W/ ~$ `4 l6 T) `9 S解题思路4 Q/ j4 M6 A, w% S. e( [) i% I
数据范围很小,枚举所有子集即可。% m+ N+ |4 Y6 i' f& q( I
8 C. {+ t" \, L- _ I
代码展示: j) _- }, G) i" p
/ c' g, t5 [; Q3 }2 [4 Mclass Solution {
- Y Z% C! `" M" h public int countMaxOrSubsets(int[] nums) {- M0 o9 j9 f T, A8 e( k! X
int max = 0;2 J. {4 `. C; w" j$ ?& _+ c! Y+ M
for (int num : nums) {
+ ?3 l, o0 u, G1 F! k- d# Y' G max |= num;
' d( g" c6 z; m' @. g# ?* X }2 |+ M9 R% d4 e" o
int res = 0;# O$ Z ^. `' [% k& p& b M
for (int i = 1; i < (1 << nums.length); i++) {
) Q8 h8 ^/ g3 N" s5 @* a int or = 0;4 p: q; O, j. c( p5 Z# ~) ]
for (int j = 0; j < nums.length; j++) {# P6 j& q5 @3 C- a5 O9 P
if (((1 << j) & i) != 0) {
9 t* Y) w, i: N& G, {9 d7 l or |= nums[j];% k' z3 l% n& w5 G1 V/ D
}
$ @2 w- ~ w/ s7 K e }3 M7 P; g$ S! `$ B0 a' v
res += or == max ? 1 : 0;7 R" h. V+ k7 v2 x
}' G' V0 _# g, y$ J! l
return res;2 @- |: b) U0 ]0 y9 T4 Z
}* T1 X- _1 J# k
}- r( v b0 H: u" ~6 p6 b) \
- ]4 f% o: ], k* a5 i
; u7 S( I0 N- ]/ A$ o) a# ?/ M【 NO.4 到达目的地的第二短时间】5 j: W# P8 ~1 ]4 Z7 p5 s9 G
" e7 Z( w- @ G4 f* x解题思路5 f( R2 w+ h2 [3 i1 J
+ ~* a( j9 b, _- s: j, z" [
Dijkstra 求次短路即可。需要额外处理的就是红绿灯的转换,下述代码中,将等红灯的时间算做到达这个点的时间,比如从 A 走到点 B 后需要在点 B 等红灯 x 分钟,那么就相当于 A 到 B 的路径长为 time + x 分钟。
, g, ` B7 r8 a( M' V) q }! d, q8 M- v2 s# R# w) r( I9 R% H
代码展示
: @; K# h2 ^' ^" x
* g/ s/ A- z' [ Q8 Nclass Solution {
1 x, i7 W" @ {2 \+ B0 @$ l static class Node implements Comparable<Node> {. U' s- H& q/ |
int min;
V1 h( X, _/ q: C2 N: t int idx;
3 d3 p+ r6 {) @2 R% B! k% V) H7 D# x7 B) s7 n4 A4 S% ]
public Node(int min, int idx) {# A2 `0 w: d# |, H3 F
this.min = min;/ A( y7 r: J r" o; Q! Z
this.idx = idx;
% t0 t1 ?2 V7 ^ }
4 P- j- x& d! x9 p4 {; \) U, @; O1 V; T
@Override" {0 H! S' i+ {: w; z
public int compareTo(Node o) {. y4 Z+ X2 D% j
return min - o.min;
* ^2 d z4 j. D1 R: Q. i% V }
! u! v }' @/ P) X. H6 x1 r }1 X! W# P* }, _5 M9 E8 z0 Y$ N
# O) s' i/ v$ K& ~
public int secondMinimum(int n, int[][] edges, int time, int change) {* c+ [7 B' ~& T+ M1 V2 {: A
List<List<Integer>> graph = new ArrayList<>();/ M, \6 [ }. _& u: H2 }
for (int i = 0; i < n; i++) {( x, S: c# g* |- E* s H8 J# q3 g) `" {5 i
graph.add(new ArrayList<>());
! u: z, d- G* Y _4 Z2 F, I0 u }
7 A! N/ W' d3 | for (var e : edges) {) q) F( p* s5 `# F ?
graph.get(e[0] - 1).add(e[1] - 1);
; ^) @0 B) M+ u1 x- E) Y$ F graph.get(e[1] - 1).add(e[0] - 1);7 u2 x+ `! P2 ?3 k2 [
}
' Z, l, @# p9 ?) M s8 J& G' H# x( |3 W* O; Z9 E& Y, Y- f5 r S
int result = 0; // 最终答案2 e2 x) P3 e) X# k7 x% d
int[][] min = new int[2][n]; // min[0] 最短路;min[1] 次短路 (min 数组包含等待时间)1 k) o) t# P% @' a
Arrays.fill(min[0], 0x3f3f3f3f);
$ B$ J- g/ E" T Arrays.fill(min[1], 0x3f3f3f3f);
6 x- p( K3 |, l% H H4 M9 _" c min[0][0] = 0;. l3 R3 A9 ^# z# a, A
PriorityQueue<Node> heap = new PriorityQueue<>();
, \- x) m! k6 w/ ~. h heap.add(new Node(0, 0));7 r8 S" Y7 p5 C" m1 K* E) N. H G
while (!heap.isEmpty()) {
' ?& d! v, M4 X2 }/ w. D Node node = heap.poll();' m7 I& P- u+ j" Q; I/ O
if (min[1][node.idx] < node.min) {) _. F- l' e. \
continue;
& I( j, g; K' C, F9 O! t+ t9 K }/ U! f. A" F# n E: l
for (int nxt : graph.get(node.idx)) {/ e: Y$ r5 l t; b
int nxtMin = node.min + time;) B& _# ~" y. H0 g
nxtMin += waitRedLight(nxtMin, change);
( v; X0 e' o) A* T' M4 m if (nxtMin < min[0][nxt]) {# j, K' a0 ^. D/ e
int tmp = nxtMin;. ?* E* ^ t9 J& ^( G, W) z3 e
nxtMin = min[0][nxt];
$ G J5 D0 x7 R3 M, A+ i; t. b2 o, E min[0][nxt] = tmp;6 i/ T; ~# r k7 x# n" }1 b( e; M
heap.add(new Node(min[0][nxt], nxt));0 `% \% |. n! g+ G P0 R* f
}3 x X: Q1 t' p( a, A- Y, F) q% ~
if (nxtMin < min[1][nxt] && min[0][nxt] < nxtMin) {
" J" p& w% y, B" y! c- Q* [+ s2 V" B) k if (nxt == n - 1) {7 M, y" l# ?- `0 ?7 e) o A
result = node.min + time;; A/ E5 G3 t2 O6 [2 ~6 i! r8 c
}* V" f) K) C$ i# b* y9 U
min[1][nxt] = nxtMin;. D6 E$ K, k- t& Q) U# W7 @2 |, _
heap.add(new Node(min[1][nxt], nxt));
/ T c, r( @2 Z }
/ F' I: A2 n. O6 {5 t+ g }: {) I6 Z9 z$ Q8 j
}
, O W- C. o) P' T2 T: m R return result;5 G4 f' \/ u" T* P
}
) [' x$ Q5 L% m. H+ V3 H6 O6 s
$ W3 K( f1 v! T- s+ y( K/ u' J2 [ private int waitRedLight(int now, int change) {. `/ j' ?- }/ Y' b
if ((now / change) % 2 == 0) {& n0 p, X7 t* s
return 0;
* F) l+ I8 O5 t1 Z& V) o( ]! x }
& n; B# p: S* ~! F& ~' c' F6 u. N+ L return change - (now % change);/ I3 i4 j- ^- J; C) e' l
}
& ?! V$ j4 M0 S0 H% Z* j: t: ^: h} |