登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 买票需要的时间】
' t8 o+ i' p9 }- R1 \: p0 c% c4 n. n. t* P, J
解题思路" I1 C G" A( n8 q' U4 S5 o2 T9 b
签到题,使用一个 LinkedList 模拟即可。
- }! j2 n/ T2 n3 c' C, c P' B- a3 J. M% Q( o6 M9 F8 B$ @# C
代码展示. N: [9 b4 V" `
) _2 h3 B+ t. V8 ~5 q) ^class Solution {
4 S4 ?) }5 S3 n+ C/ { public int timeRequiredToBuy(int[] tickets, int k) {& Y, Y' V! f3 K6 o* W
LinkedList<Integer> queue = new LinkedList<>();4 G( c. E7 E9 c
for (int i : tickets) {0 G% E3 k% Y2 T" o6 {0 |( N: @& {
queue.add(i);
- x) O v; F: G1 J }
( T+ f0 X7 M$ {% X' a6 Z int result = 0;0 d# @# l$ [6 _/ S8 U$ U! A O
while (!queue.isEmpty()) {# Z9 s o( t Y' B0 a- N7 U
result++;
7 G% s3 F) T% {: N1 ^* W0 @. M) a' X9 n int t = queue.pollFirst() - 1;1 v% _, \9 ~3 ?" ?4 k$ d' `9 g/ f: Q
if (t == 0 && k == 0) {. m6 @" z) K* X# V
break;
2 u; J% ^4 |) r) Y }
- _: t+ w1 t# p7 s$ S% T4 M2 o# C6 A if (t > 0) {( c& Q( ^ L1 g9 l6 c
queue.addLast(t);; N' o# H6 Q) S, f! C( U
}
% V5 J2 v6 c: @ k = (k - 1 + queue.size()) % queue.size();
& e6 I8 i: ?8 g' f }
E! L4 S5 g" o, s( Q return result;1 i% F7 @1 p4 |6 M3 b
}# J* t2 E/ ~+ j: W
}* i7 D& b6 b- W" L( S& l7 Y
& L* N. w/ s/ U0 \) i' i" |【 NO.2 反转偶数长度组的节点】' W& Y0 d( |! j& H* S
7 Q0 z8 ]0 Z4 C6 f( u# G解题思路8 ^: g) U, B6 b9 m( g# O! \3 ^
数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。% r+ S6 ~5 ?! S2 Q
7 |( ^) H z# ~! }/ A2 b: r3 b
代码展示
- q5 h% t9 T) y% s
. B& I' c: {$ u& C, `) Xclass Solution {
6 |7 [ W# l3 @; g9 T* m) s) D public ListNode reverseEvenLengthGroups(ListNode head) {
; F z+ z: {/ r; V- _9 m: N List<Integer> list = new ArrayList<>();
) N) M, M) i& ?+ Y: ` for (ListNode i = head; i != null; i = i.next) {
f: z- Z0 O( l& c: ~9 R" A1 v list.add(i.val);7 c& g! t# Y% U; P. E( u& s
}, y8 q. v2 {1 S* C4 m
for (int start = 1, len = 2; start < list.size(); ) {& M, U6 }$ L4 \2 x! J& h' J. {
int end = Math.min(list.size(), start + len);8 q! N; y4 e) R _. H6 p3 T' C
if ((end - start) % 2 == 0) {# [; x) f0 F% |
// reverse [start, end)
" k3 y' s5 `0 Z6 { for (int l = start, r = end - 1; l < r; ) {
9 a, q! R! s" j" @! v int t = list.get(l);
6 f7 q# z" l- `; P0 V% W7 N8 Y* v list.set(l, list.get(r));
) Y$ O, v" P, Z/ [2 P- y8 h7 ` list.set(r, t);1 D G/ s6 ^1 T4 Z7 r6 x- v ]
l++;0 b5 h( x% w, @' i( x* I
r--;, C/ \+ W; ~8 J' V2 R! y+ w5 S
}- H+ W9 {% S7 m5 O- M
}/ t* F5 k; z- C: n9 P
start += len;% E3 S1 Z5 u! K1 u3 f3 W
len++;3 }1 v+ W7 S9 p' ~1 ?7 s0 c
}! C/ L) h6 c+ i# ?+ z) f7 \0 B
ListNode h = new ListNode(list.get(0));
: H! ~3 Z h8 I$ i: R& q! | ListNode cur = h;
" m8 @ K6 n. e for (int i = 1; i < list.size(); i++) {; S) i2 c9 P# b6 U' g6 E4 y
cur.next = new ListNode(list.get(i));; K$ ]( d! c) S, W
cur = cur.next;7 P K# Z( q# e
}" H# h+ K( d; c' T6 N; E
return h;% b. ]$ H" y& G! Q
}" K8 R! [# w" ]# \$ M/ }
} c2 w1 }" t% {
/ I# u" }* ?* G
【 NO.3 解码斜向换位密码】
4 _9 G" Z) \+ O7 e, F% C
+ Z: K1 U, a) N# R' p3 o! C+ }4 S& ?# Y解题思路8 N. T4 e0 B8 X" D% f) b w& k
还原出矩阵即可,最后注意将后缀空格删去。
4 v/ c+ ^# T. J4 c
: w# t: N1 c5 R# N6 u代码展示& r. l6 c9 V& z; v) B
) j$ ~. L) U& I( i* J. ]: l9 b' ]class Solution {& K1 z5 ~& m; i3 F! I
public String decodeCiphertext(String encodedText, int rows) {
/ J7 n, Q- u- e6 E8 N# V1 }8 i. _ int cols = encodedText.length() / rows;
2 y6 C% ?5 d- S; R" `9 U char[][] mtx = new char[rows][cols];
5 g9 z6 D9 ]5 U+ U for (int i = 0; i < encodedText.length(); i++) {4 X& x( ?$ B# H! p* O3 h+ f) _9 v
int x = i / cols;
1 x; K* X; f6 R) B" a( I% _3 t int y = i % cols;; ]1 w D8 X, [6 @! h: P! g
mtx[x][y] = encodedText.charAt(i);6 p" Y. w7 }% Y% g5 a
}5 N. f/ s/ Q6 q; B& P' j
StringBuilder sb = new StringBuilder();5 v) H% s* H# f6 a& B
for (int startY = 0; startY < cols; startY++) {
3 }% G0 ]2 ]1 U+ ]- l) |2 U, q for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {; U5 A- W- c+ r: y$ T+ d
sb.append(mtx[x][y]);
; ?! ~3 r w) O) U( d1 q }
$ B3 h3 ?' P4 [. k) H r6 X }
% h! E7 C; q- l: M while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {
P' e2 k5 V& M: [/ Y! _ sb.deleteCharAt(sb.length() - 1);
4 [# ^* r: a* M) B5 V* K% \ }5 C. B$ z x9 f) u0 X( g8 H& W& R" g
return sb.toString();
+ B( w6 B% d6 A0 @8 a4 o0 L9 X }
& E% n& ?" T4 ~9 }4 |}
- S" ^* F" n- [# h8 U
$ r" U7 O$ A) V. A% u/ K7 L& W6 w; @/ D
【 NO.4 处理含限制条件的好友请求】
0 [0 V. ~+ z0 {' O5 j4 Z; h( U! M! |* H
解题思路
9 H; ?4 P7 d1 K2 R并查集,详见代码注释。
' u8 ~6 i, L B! X) `3 ]$ D+ ~: u# _
代码展示
/ T; G- s* V$ L* L% x
$ _1 C4 J) @$ |5 v9 A: k( Qclass Solution {
* Z5 F' A& m" g* h% n. R public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {" o% |# q: l& `4 S! q8 X# o
boolean[] result = new boolean[requests.length];3 g1 y' w& H4 m
// R[i] 表示不能与 i 做朋友的人
8 d5 S" p, P8 p. N0 @ List<Set<Integer>> R = new ArrayList<>();, q4 H" p0 D' x, B$ A5 H
for (int i = 0; i < n; i++) {
# `. O- F2 H2 ?9 E& w [ R.add(new HashSet<>()); g N7 \* d1 ^/ T
}% P- N' v1 h0 d' @
for (var r : restrictions) {* D+ y& _% D/ T' Z3 O
R.get(r[0]).add(r[1]);
. U2 q- p* a7 M# a' t3 P, P R.get(r[1]).add(r[0]);
6 @ I: e3 M$ }& \; w* h. c1 v2 @ }
9 l* n- j* z0 X9 u7 r, A; S // uf 维护间接朋友关系
$ @3 R% N! p1 J$ c UnionFind uf = new UnionFind(n);
- Y5 j' Z: H4 @! k0 O7 t for (int i = 0; i < requests.length; i++) {3 Q/ v! Z8 t- m2 d/ l. |
var r = requests[i];- w$ c: V* B( {
int f0 = uf.find(r[0]);
5 {$ Q- d& {# R/ ?" f% \$ O int f1 = uf.find(r[1]);
& n: Y. N+ A8 k. M if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了
2 k5 K, o% o3 b- Q6 p- L result[i] = true;
, `7 ^7 ]# @2 K* D1 u8 C' ] continue;& \+ {0 B: F' d- Z# U$ F
}
1 ]% t" d5 H; U H' k // 由于我们总是将限制关系合并到根,所以只需判断根节点即可% o" y6 k" e: P, a9 y- I
result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);
. S) }8 ?3 n3 K if (result[i]) {0 J" W F. ~6 c* Q- ?5 b
uf.merge(f0, f1); // merge 后 f1 将成为 根4 q' J; ?" R d+ c3 e
// 原本不能与 f0 做朋友的人也不能与 f1 做朋友了) K3 ]4 h/ U3 J) Z
R.get(f1).addAll(R.get(f0));; d3 Z. `5 h. c
for (int j : R.get(f1)) {
+ g ^ b$ y; J: z4 d( H0 c R.get(j).add(f1);
5 ~/ ~( K& a2 u) i& E }
4 [3 o; N. C$ w6 P4 ] }
9 C2 s) z, r/ Z6 f" x }% j1 x. G( p" k6 c! |) _( I
return result;
$ R8 e, S% h1 M' I4 a M9 [ }
, k# {* J0 t2 r5 ?5 r}
! d' I! U! m! v, A: U3 N
0 ^: V o2 {; L5 z" \class UnionFind {
' T" z: J: ~' C0 C& P( } public UnionFind(int size) {
8 a6 Y& k9 `+ W f = new int[size]; B0 v4 n$ K8 A7 g. V
Arrays.fill(f, -1);
4 ~5 Y# ^9 X% J }
9 Z8 e- J* j$ U; n; `2 C% ]5 k1 ^- |( V0 g. I
public int find(int x) { u2 l; J( F1 `
if (f[x] < 0)8 s: s# U. |5 { U6 F
return x;
) D+ y7 R( m5 F2 \6 m1 j2 T return f[x] = find(f[x]);
2 K6 z& R5 D& _/ s& q( U# \ }
; X3 f( P4 q Q& [9 M# m6 s( ?4 t2 P( w* |( s9 R; I( [9 v: [
public boolean merge(int a, int b) {% g8 V& u# f" S5 C+ d
int fa = find(a);" p2 m7 m) W. v$ q
int fb = find(b);) f" Q' C% L% d+ @* S
if (fa == fb)1 ]& |# ^4 f7 F) _" J
return false;9 t4 V( q6 @! v3 i
f[fa] = fb;0 D! Z5 Y' k+ b: i, U
return true;% R! l" u+ O" t' D# b
}- E8 U+ c! ?# ]! ~% v
! z8 b( C$ e1 U
public Map<Integer, List<Integer>> sets() {
- x/ j7 w' Q/ h. E" v6 H Map<Integer, List<Integer>> res = new HashMap<>();7 M6 ~( y) I" r* q# g# E
for (int i = 0; i < f.length; i++) {
$ g' v' [, ]( q. d2 J int fi = find(i);
; i4 }( P0 F* T b V" I4 h if (!res.containsKey(fi)) {
+ u1 _" K9 X0 G res.put(fi, new ArrayList<>());7 H( F# L0 h- h) ]) Z# g s5 n7 S
}5 J* K$ O8 d' I4 P+ b% Y
res.get(fi).add(i);5 j& t6 ~- ]% U
}' o* M- ~( ?) }- d$ M& B! ?, |; B" L
return res;, W* @: I3 W% `
}
" a/ D( ~6 l8 S# l' |% i7 q# r K* K5 C. M! v* B2 D
private int[] f;
. R7 ~( [/ f$ p, \% r- I9 \}2 v0 G4 V! i" w; g
|