登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 买票需要的时间】
2 S# U" p0 R% n* z, n9 I- _7 z2 @% l4 Y% h& [- s% g1 H
解题思路5 v2 e% q$ _. X$ D: ]
签到题,使用一个 LinkedList 模拟即可。% F8 Z6 G4 W" ?8 c) K
- ^' ~* U$ Q& B/ \2 c' p代码展示0 d1 _ k, S- f5 `' F
. j0 ~, |3 d% [$ y8 M9 l
class Solution {
- G/ r- x9 G9 \5 b, k public int timeRequiredToBuy(int[] tickets, int k) {
0 a. ~0 x. g% O LinkedList<Integer> queue = new LinkedList<>();
2 V9 ^* C1 \2 ?) K5 E for (int i : tickets) {
) L. `) e5 H* F; C+ s queue.add(i);
* B7 t/ z- e9 R }4 W3 K4 m& ^3 }5 c1 C' C l
int result = 0;
' ~' T! T, N+ J2 j; w while (!queue.isEmpty()) {& w9 @% Q% t+ K+ M4 d E' r$ @, g/ C
result++;
1 O, J \, k! J% g8 k* y int t = queue.pollFirst() - 1;
$ r; J: y" T0 ]9 a3 N if (t == 0 && k == 0) {
]) n! N" S. @/ n2 S8 {$ ` break;1 _! V" s' d" n7 P' b
}# v& {8 r0 J# s1 `8 A
if (t > 0) {
" u2 e6 A) l- {% Q0 X queue.addLast(t);1 K$ K4 t2 P4 N) A# q, ?; g
}
! X6 [6 D5 t7 Z( n) ^' x; X+ k, g9 m k = (k - 1 + queue.size()) % queue.size();
0 W7 T7 h* c2 m% z0 w, {% b8 T. j }# V8 s! @0 h+ Y, e) E; B5 `$ m& f8 c
return result;* |% F7 q% h+ r$ {/ H; K
}
) }2 p5 _ y- E" X/ |}
! @ P% X) \2 x7 |. q
& c9 g& d9 C% @: |$ J7 y0 N8 C: C【 NO.2 反转偶数长度组的节点】
# Y Q0 X) f. d9 J
- F2 \4 A5 B" e4 a3 W7 Z解题思路! C7 n/ N7 K- @) l3 h* |2 c* F
数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。% A; V$ b% S( M' b! E
' y1 C( v# s6 y6 s代码展示$ X' I: G% u+ a. F" x1 {+ H
" u0 S4 X3 ~1 d& j- e
class Solution {( M, C g u/ g ?4 i+ O6 C
public ListNode reverseEvenLengthGroups(ListNode head) {- i W8 u3 a) W
List<Integer> list = new ArrayList<>();' U6 D! w8 l- t2 }
for (ListNode i = head; i != null; i = i.next) {6 E& D3 G. E' m5 I
list.add(i.val);; l9 q u4 E, y; F# ? t- G0 j
}: x% I" `. T' M- F6 C2 m& @, c! h
for (int start = 1, len = 2; start < list.size(); ) {
8 ?3 y, Y+ m) B3 x8 p& G int end = Math.min(list.size(), start + len);
3 n* H8 ?* ]1 b3 E2 e( H if ((end - start) % 2 == 0) {- B! p2 ~/ H5 {2 [4 u; t7 y8 S
// reverse [start, end)& W, n/ J' Z" Q
for (int l = start, r = end - 1; l < r; ) {8 S, J% Y& x" o' u% w+ L' ]: W$ P, M: \
int t = list.get(l);4 w5 P2 x) b5 e8 O9 h
list.set(l, list.get(r));
$ B0 ^0 I1 ^! N7 p* m list.set(r, t);
/ g. g) |2 h3 I' Y7 h. A$ O4 j l++;
2 o, G/ d, V3 Q# w r--;
2 I, Z% S1 _+ ^6 J! c }) O- j/ w6 a' _4 b' W ?. ?6 R+ ^, X! b
}
3 k/ `: `3 _9 J% }/ W start += len;
1 s; T2 ?& g: q) z len++;
8 Y3 P6 E' N& a$ \; |# ` }
. n" o6 C8 K: F U4 P4 @ ListNode h = new ListNode(list.get(0));: G G/ L [" _% s
ListNode cur = h;5 A( D. J+ b7 a3 P+ E; X' }- E
for (int i = 1; i < list.size(); i++) {8 y F* M* Y) R/ F9 b: V+ a
cur.next = new ListNode(list.get(i));
( }1 P% h( ]: U7 _% i6 V: O cur = cur.next;
7 x' S/ a# E ?( K }
# @% g7 D( D0 L* f% {8 _) ]$ l return h;9 R# t w" R2 N9 t* a, d& O% E
}
0 U5 [2 v& Z* E# |4 S}$ ]6 t; p: {/ `) X' p) d: }
# D% ?6 l8 @8 g【 NO.3 解码斜向换位密码】
% y- w# E1 X v$ g" { O
4 L/ K( I8 ^. D" e. |; s解题思路
) O( h5 t1 b7 H* n还原出矩阵即可,最后注意将后缀空格删去。 B: Z0 K: b$ N+ L% k) l& b( Z) r' W1 C
5 q% @5 z) R' T3 A+ e) }0 z7 s
代码展示
/ r+ \* L( i: a) S5 H/ |2 I5 A, L
& Q2 {' _+ r) d0 {5 [5 Mclass Solution {
, Z9 h# P& q9 F; ~8 x- m public String decodeCiphertext(String encodedText, int rows) {
. v: `, _1 A0 e( B9 A; C int cols = encodedText.length() / rows;
0 h, x' v/ U+ k. f& `( h/ r; X char[][] mtx = new char[rows][cols];2 `) X$ V: k/ l4 c5 c
for (int i = 0; i < encodedText.length(); i++) {
+ Y6 V0 ~2 Q; M4 } int x = i / cols;% G3 Y6 W" f5 x n$ N
int y = i % cols;& p. y9 P! K9 `6 [2 p& {
mtx[x][y] = encodedText.charAt(i);
4 H. v. |, ~9 t" z( v& q; M- Q9 i. ? }
7 i$ k- D5 ^9 Q StringBuilder sb = new StringBuilder();
- ], o5 ^3 @0 T( d9 T6 j8 g for (int startY = 0; startY < cols; startY++) {5 C% j7 `3 p' x P$ C2 ]/ V
for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {
7 e3 M9 J5 W/ ?2 ]5 l sb.append(mtx[x][y]);. r4 f, J- [) r7 [
}
: A5 a' ^7 W- r5 N# G9 x2 w }
8 ~+ ?. a9 l* O) s G/ r7 X, { while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {. C! I+ D1 i/ O; y# i
sb.deleteCharAt(sb.length() - 1);
+ g |$ ~3 F. a8 _0 { } D1 `# V' {( e
return sb.toString();& f: m$ y2 t, J
} |/ c6 n* J3 F, |' `4 G/ {
}& z& e Q9 _9 y# G4 m" f
* U/ @- b3 }" e0 U5 c* X
3 { h/ k0 i, ?/ D5 q) J( x1 r/ c: O
【 NO.4 处理含限制条件的好友请求】3 B, }% Q4 M3 q/ s, q7 |3 L ]9 B
3 E& y! m' r! c+ u' i( R- g7 y解题思路, \; X3 J2 a2 s
并查集,详见代码注释。
+ `7 S6 n- V6 o5 m% C9 j: m9 i( L$ l X2 L% s9 I L- a8 k
代码展示) T3 R& M4 `* w) b Z3 R& j$ z
, C1 q* C6 }& z! ^ |/ p% H
class Solution {
1 T( B/ {+ z' T$ L P0 E6 f/ T+ W0 y public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {3 D3 K; j. _9 S, d6 i
boolean[] result = new boolean[requests.length];2 e# @! ]3 _1 M
// R[i] 表示不能与 i 做朋友的人
! y$ a, M8 l( t- j List<Set<Integer>> R = new ArrayList<>();
! J! n2 r5 C3 {% k, l5 W" Z for (int i = 0; i < n; i++) {3 H6 z* w2 L7 U, D% T
R.add(new HashSet<>());2 W7 `2 q' ]( m8 K- |
}& P- V) Z+ K6 D ^6 ?1 p
for (var r : restrictions) {
# E# s+ J8 c2 I e R.get(r[0]).add(r[1]);1 U1 ~" Q7 m! n! G
R.get(r[1]).add(r[0]);
7 i# O( i, e3 N5 G6 U6 c$ f }
' ?. [- W+ X8 r7 h3 K. @$ \' V // uf 维护间接朋友关系7 j" q2 d: t1 q" B( o
UnionFind uf = new UnionFind(n);, c( p% {8 t" u% ~/ J, T( |4 k
for (int i = 0; i < requests.length; i++) {
6 q% V6 V$ C$ K3 Q var r = requests[i];
* r/ @! c; v( I l+ ^0 j& ~$ ~ int f0 = uf.find(r[0]);' o1 ?( R1 w8 q% I
int f1 = uf.find(r[1]);& o S( t9 z# g2 K$ z6 k
if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了
" L; e" o9 y8 e7 O result[i] = true;
* ]5 i9 r1 {% U5 {( A) ^ continue;9 B) z$ j8 O* O& l; v" I. s
}3 Y3 `" D1 n! T( f/ L1 Y& c) Q
// 由于我们总是将限制关系合并到根,所以只需判断根节点即可% r+ q: b. G4 M
result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0); D5 }# ?) z; M4 x2 O, p
if (result[i]) {
4 ?' @4 ?( Z" m' \ uf.merge(f0, f1); // merge 后 f1 将成为 根/ ^/ Q" i, }) P0 ~4 n. j3 v
// 原本不能与 f0 做朋友的人也不能与 f1 做朋友了 u7 |: {/ w: r+ B( x. B/ U
R.get(f1).addAll(R.get(f0));) ?+ }. P! P4 j$ Z" L
for (int j : R.get(f1)) {
% D* O- i. r7 o* ]& o R.get(j).add(f1);) L$ U; c4 w$ P5 B4 e2 R
}
$ L9 f1 |, C6 c }! f$ L$ I& t* l+ v
}# b8 C. P# V0 L9 D
return result;0 [% g: i# r8 L$ @8 ]: X, U" J1 h
}
) Q' p9 _2 F) n}4 E0 c. q' L/ c. r7 E
# B& y4 c: A+ ?# [) {3 pclass UnionFind {4 _6 j3 ]6 p6 E/ i
public UnionFind(int size) {' ]% T9 O( m4 g, g5 p
f = new int[size];3 J, v" B' K9 ], e8 A4 {0 ?
Arrays.fill(f, -1);1 w6 T9 Z |3 Q- p* O0 P
}- u0 I+ T) o6 N, ]5 K5 f/ [
4 c% E0 q% w0 W public int find(int x) {
5 T: I' H/ H0 Z& j' v! V# m9 ^ if (f[x] < 0)8 N( g, A# m0 z: L2 G
return x;
5 d, v# B5 W9 Y8 J- O" s0 G return f[x] = find(f[x]);# d( P! |! P/ w0 I8 H1 u
}6 }9 R' n6 h" c$ r$ S' o+ `' ~0 p( U
/ Z& w( _5 V% a. r+ a5 q! Y4 q
public boolean merge(int a, int b) {( `% L q$ Y1 t! n: ]3 u$ z
int fa = find(a);
$ n0 k+ n9 R( c) j" e7 L: C6 } int fb = find(b);
7 E$ `! c) S2 l if (fa == fb)
; Z+ H0 |7 a0 w- T, F1 ?$ I return false;7 a% L, v' l! {8 g
f[fa] = fb;
! v' P" x) K7 e+ y return true;
; ?" |% Z7 f+ X" P4 M2 O6 Y }" t% T4 }) a3 S; c
: W) w/ z/ E& j8 _# y T2 i8 x( g public Map<Integer, List<Integer>> sets() {
$ s7 i6 J) W2 z$ y1 l Map<Integer, List<Integer>> res = new HashMap<>();6 g" Y* p0 Z( F' N
for (int i = 0; i < f.length; i++) {/ N8 D% X1 u, g9 S/ r; U/ d
int fi = find(i);
3 d9 g, M% J+ K2 x, [$ J if (!res.containsKey(fi)) {
. o( r# h. N6 Z1 B/ E) L) ~( H res.put(fi, new ArrayList<>());4 r2 P# K! u$ i4 R/ E7 O5 N) ?
}! c; e* c, R# ^" [6 R
res.get(fi).add(i);
% U6 A4 e* C& N& Z- ]' h# U& L/ s f }! G( I7 m5 N- G$ U% N W1 Z$ H
return res;
; N9 r4 L- C$ Q/ [$ g1 B$ Y: A }
. u6 J3 O4 b- q- b3 ]# S C9 G5 ~: W
private int[] f;8 y4 j; `: U4 @5 S8 S8 W) N
}
" L, \! T# p9 I3 d& D2 j1 l |