登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 买票需要的时间】0 t7 D* K1 l" P" Y' d
# h6 I; d# D, h- S! y5 {1 P- o/ L解题思路
' a) p8 J$ U, E7 v7 g& [签到题,使用一个 LinkedList 模拟即可。. T) U* d9 M5 ]0 b
: a: b5 d- e& z% |- ~) V1 ]3 O代码展示
) Q2 w( B4 t# d0 G5 a, x
9 Y- U3 D: v5 b: Z3 a8 K+ E& xclass Solution {
8 k1 s" ^$ [; [; s' f+ s public int timeRequiredToBuy(int[] tickets, int k) {! u, x8 u3 b9 s6 I( ^
LinkedList<Integer> queue = new LinkedList<>();
3 B% p4 N: M9 t for (int i : tickets) {+ \# U" `1 [2 b- y+ S
queue.add(i);
* [% K$ u- h& i, y, g' n, d }. I. ]8 q' b* I& j* B* i& P* [
int result = 0;8 o9 D' ]3 P* M0 z9 S
while (!queue.isEmpty()) {9 Q+ {, ]* V0 \$ W. ^. ?2 a2 V
result++;
6 J7 f. g' u2 G% q: e int t = queue.pollFirst() - 1;$ x8 R5 H3 q7 z
if (t == 0 && k == 0) {
. P" O2 Y) s. t0 b' R/ r break;1 Q6 L0 ?8 V& u0 b5 R6 s# K
}- [0 s$ Y6 A, K2 R8 g
if (t > 0) {
- ^' S g0 T5 N* c( Z queue.addLast(t);
# d* _7 G2 U* i }. | u; k) f w$ |3 Q I
k = (k - 1 + queue.size()) % queue.size();0 m ?0 L" x* ~+ N
}4 c2 ]1 Z& y# V$ l% i! p+ A' K9 V
return result;
, z) v- E! `, u( f1 @9 Z. {/ s: s } ^7 b1 f4 z* y5 l. x" ^6 Q
}
) Z, ~' _$ Z: P5 W8 Q9 C& I" u
1 u5 N; Q9 L! A- G5 J& W3 {6 Z【 NO.2 反转偶数长度组的节点】4 F: Z; V3 c/ D! h, V0 t* k
- `6 E+ r8 N! x+ o _" k& D
解题思路+ \1 C; _, a$ q. a& V7 j3 u
数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。- l J; P4 P9 ?6 |7 F" U
% j8 P1 `! K8 i6 s* ~+ z
代码展示
- g! }) J( f0 P. Y4 [2 `
% L! L, y5 x$ e' U+ b5 p; _1 z cclass Solution {
( i( }% E5 E% u9 K) ~6 r+ o2 O public ListNode reverseEvenLengthGroups(ListNode head) {
U' t: D; i$ ^, L4 d List<Integer> list = new ArrayList<>();
, |: `3 D0 v4 f0 O, n& \2 F for (ListNode i = head; i != null; i = i.next) {
# l+ }5 V6 M3 _. | list.add(i.val);4 }* A: x3 j/ {% M, R, G4 N: i. K& e
}1 ?8 n% G; D* t# J( t S3 _
for (int start = 1, len = 2; start < list.size(); ) {2 H6 m- B; K$ F! U/ r
int end = Math.min(list.size(), start + len);
3 M/ S8 X( E2 z/ q4 v1 N( ~ if ((end - start) % 2 == 0) {# ^3 u; @1 K9 y+ E: X1 V k6 ~
// reverse [start, end)
" y. A9 p. b) k9 `- r1 a: E for (int l = start, r = end - 1; l < r; ) {
" B* s( z; }( A" ~0 D int t = list.get(l);2 U# i, }% W1 T! }
list.set(l, list.get(r));- |: y6 v* I; _7 x* Y+ C
list.set(r, t);
; L7 ?4 j6 |8 ?/ H5 ] l++;: T' r: V$ c4 a
r--;& \0 X/ P, }; R. {
}$ M, y, E" E/ \1 J- J) e
}% n* u) z o& r' B8 j6 Q6 a7 i. P8 t g( z
start += len;
9 Q( c. | a2 ?3 x: Z% Z! u len++;
; x3 n6 J `7 b1 [( e- R+ h+ Y }
J' Y; B- e; S9 \5 m5 e% }; q( F ListNode h = new ListNode(list.get(0));% [8 B H9 H Q" _1 R7 j" e
ListNode cur = h;
2 N6 g3 M' L/ D" T1 _ for (int i = 1; i < list.size(); i++) {
. Q. h) j) s/ G H7 X cur.next = new ListNode(list.get(i));. K) s0 U9 L+ d1 l$ K
cur = cur.next;
) S+ T f1 ?2 F( D5 E; { }
& T3 _4 e1 p1 S+ ` return h;6 S+ V' C* L& Q4 M- \ J
}
9 w. c" h, g* [6 G}
% Q0 E0 W! M G# F
) E7 s% _8 }; l- S! h, c" Q# H6 ^【 NO.3 解码斜向换位密码】
& h/ Y0 a0 [2 w' l- t9 @ f+ M, z. l6 \2 F/ X. ~! Q- B& D
解题思路
# a1 S# d. `" M' \# o" N还原出矩阵即可,最后注意将后缀空格删去。
2 `) k. K0 A' p) p# A1 T+ S- q5 U$ H1 z1 Y$ d/ k. k1 A+ z
代码展示9 D v8 Y" H8 H) o( z3 n4 v
' |3 T% ^4 ?$ `. H
class Solution {5 G' N* a' S2 O2 L
public String decodeCiphertext(String encodedText, int rows) {) g/ V& M: e9 d4 c2 z; T
int cols = encodedText.length() / rows;
7 i1 c% u+ s3 t: F char[][] mtx = new char[rows][cols];
) ?! x. O" J' Q; O3 s for (int i = 0; i < encodedText.length(); i++) {
/ E/ S; ?0 E' G1 R/ e. q int x = i / cols;" T; S* E5 D/ A: Z2 U+ q, b
int y = i % cols;2 v4 s z8 a8 z
mtx[x][y] = encodedText.charAt(i);+ B: d4 I q; G D
}
0 r6 e8 {+ Q8 l6 R9 q! w, p StringBuilder sb = new StringBuilder();+ c% h! u. t- ~' Q
for (int startY = 0; startY < cols; startY++) {
9 d) `1 S" k0 h for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {
& q% k& m' ~' \) S sb.append(mtx[x][y]);
/ q, ?* X( a8 q( W. {; T }/ T* @; F" |" ?, W, ~7 B3 x' Z5 d6 L
}: C# Q7 L8 M' c h' U; d% R( N
while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {9 B6 Q; w. M% w/ r& r; f3 |
sb.deleteCharAt(sb.length() - 1);8 C! ]2 w. X) _5 _7 B- K3 r* O
}% Q; r e Y+ g7 ~+ Z. h
return sb.toString();
+ G; t9 ~; n: U" o& W+ f b- l }6 Q9 u9 T2 k l; \% x4 X3 ]$ ~) |
}# V5 H+ Q- x$ R, N! X6 C/ s0 @
# L# k. o2 A! i2 z$ ~8 r. I* J6 y2 v/ I
; e& f$ X3 X9 F/ a. H; }1 _【 NO.4 处理含限制条件的好友请求】2 o: f: z$ L5 C* H
% B1 t- p6 y% H O; h; T4 y
解题思路1 p; e' k) R4 D* r( [ I) e, }1 G
并查集,详见代码注释。
/ u! s8 d' x. W& @: I
6 N& U: g2 J, [- ^9 v8 {& o5 n, M+ P代码展示/ E& z( W0 {& D7 p4 p4 |, d- {) A2 u
$ h% I1 J* M- ]
class Solution {! T( V! d" L" t ?' c3 q
public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {
- P" y5 n/ A( I, y, D8 n4 ]% ~' k boolean[] result = new boolean[requests.length];- y; J8 _: {: [6 `& R5 `+ {
// R[i] 表示不能与 i 做朋友的人! q4 F+ ~4 F9 A( B# F1 @2 |# x) ]
List<Set<Integer>> R = new ArrayList<>();
" O1 \, B+ r- P$ Y# Q% e S% w for (int i = 0; i < n; i++) {
/ G z" a: W" O7 l R.add(new HashSet<>());6 C' O* O$ R* w
}) J4 {0 M9 O3 d$ o( A, A1 P
for (var r : restrictions) {. Q8 F7 `" C+ D( i3 M- s! I
R.get(r[0]).add(r[1]);
P$ [4 o, e7 ?( P, ?! v R.get(r[1]).add(r[0]);
# q, Y% n$ U- e5 C- @0 U/ `0 @ }
# O! ~# R1 n" v. J# B/ Z1 k4 R6 b // uf 维护间接朋友关系; s! m/ p- @# h3 {6 M) G
UnionFind uf = new UnionFind(n);
! G/ Z9 N1 ^, c5 _+ Z for (int i = 0; i < requests.length; i++) {& e3 k9 P0 t" \( D
var r = requests[i];
0 C* [6 w9 q% d. w int f0 = uf.find(r[0]);8 C1 G+ \( J5 Y( m
int f1 = uf.find(r[1]);7 u7 ]( g; }' E) P
if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了
! }! x/ S$ ^' ^5 J; e) C result[i] = true;& o: ?2 }3 Z5 Z5 j3 g. H
continue;
, s* U, o. x4 I# t }
0 J; D& m9 I4 R& i. |6 s // 由于我们总是将限制关系合并到根,所以只需判断根节点即可$ o4 e4 y! J0 w
result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);
# T, y" U2 m2 M- C) M if (result[i]) {
. {$ e$ e/ u% v9 j5 e uf.merge(f0, f1); // merge 后 f1 将成为 根% _ z5 [- v6 n! a' ?% k
// 原本不能与 f0 做朋友的人也不能与 f1 做朋友了( ^$ ]: z7 G9 T9 \8 Y
R.get(f1).addAll(R.get(f0));
8 O/ L4 S/ z! Q* u4 y* v for (int j : R.get(f1)) {
+ B9 I9 {0 o V- g R.get(j).add(f1);; N; o: e3 G; O* b3 d$ K
}
! I+ R, P% j; X! { }* I' U8 z/ q' l$ v
}$ S* I2 K5 T; S ~3 V8 E
return result;" O8 {. r1 h: ]
}: A# U/ }$ b$ [6 f q
}
4 d- J4 G$ x- h3 _
7 V/ I: c e$ \/ P( D+ ]4 iclass UnionFind {5 y3 n; K# T$ `" X: P- Z4 N M2 T
public UnionFind(int size) {" j) `3 g8 d7 j$ C( J5 Z O
f = new int[size];
2 p/ X+ S& R& c* { Arrays.fill(f, -1);
! K5 i* L/ [; f, c6 O }* Q1 e8 R+ i f) u# h j
9 W5 H% M0 l7 N1 ?6 C
public int find(int x) {( `3 P8 B% T8 X E- I5 y1 C0 Z1 m
if (f[x] < 0)
2 K( f& L7 c: K7 X$ z return x;( Q8 ]1 D6 O0 h) C
return f[x] = find(f[x]);
) }! F; k5 o8 I: U; ?2 s }
4 V+ t& Q& @8 J) \ F Z8 {2 H& L6 q2 @
public boolean merge(int a, int b) {3 W1 x2 m* f8 C
int fa = find(a);9 a6 m6 a. w% K* J' f ]- d! h$ A
int fb = find(b);
: `$ l) ], V5 s* f" a if (fa == fb)
0 a3 f; L* \; m0 N return false;4 s" b# m7 o4 O. P
f[fa] = fb; W. Q5 Y5 f4 h v4 P) R
return true;
4 L, [ s$ D7 w7 T' { }: L2 D& D- b+ L1 N) f
0 R5 O/ p) W4 Y' J" h public Map<Integer, List<Integer>> sets() {
! f3 F `* v1 n- k Map<Integer, List<Integer>> res = new HashMap<>();
! n- ^1 Z' \: W1 O for (int i = 0; i < f.length; i++) {
5 I: A" U2 n7 p. U" ~) X int fi = find(i);
) `/ j' D( j/ p4 P1 B: N* [ if (!res.containsKey(fi)) {. ^: M' B; \1 P ]2 ^
res.put(fi, new ArrayList<>());
7 p$ l# U, T+ ~8 @% i }) ?2 z" b, |1 K7 z' j+ Z
res.get(fi).add(i);
) ]- S8 B' X! U c7 Z/ R2 o }
. L9 Q5 p+ N% n; ?5 a/ \ return res;' t, m: x1 W3 D ]8 j
}: {* r4 s6 h) V/ g" h _
, w s f, [" ^
private int[] f;) z4 J' r, R. B; z0 j% y* ]. ^
}
# Z. E/ p! G* f |