登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 买票需要的时间】
. ]8 r4 Q% J2 X/ v3 f2 S& u/ ~7 D
! B" Y1 o8 a7 H. T解题思路
# c' \& o& |! s+ T6 Z签到题,使用一个 LinkedList 模拟即可。
% d) Z9 i3 Z8 m( W! P5 i: R+ L4 z: U$ R0 x
代码展示
: C$ O! l" a0 Y& J
; W" l; r. J1 M7 [# x) ~class Solution {
( }, |) f- Q; E1 k( `9 k6 M0 q public int timeRequiredToBuy(int[] tickets, int k) {2 N6 C3 Y' l7 R( j
LinkedList<Integer> queue = new LinkedList<>();
; F: H& ? B; c3 J& J- H for (int i : tickets) {, q1 A% {# r- z+ O$ Z
queue.add(i);- E/ ?( q& R* |0 X0 a0 ~
}
6 m6 b- E- Z3 s8 I int result = 0;! q" g0 c7 g' f# ^$ M/ z3 _' C8 V2 e
while (!queue.isEmpty()) {( Q. @& B, S' T/ M% _
result++;5 j0 w/ ]& _" z0 n% ]; ^
int t = queue.pollFirst() - 1;
7 A% k7 `) L2 H if (t == 0 && k == 0) {
8 \8 t7 M3 f, w( M1 _$ z4 D) k" W break;' r! G) R2 u: @5 j7 [) E. I* g
}7 T& l" m# Z/ [; L0 v
if (t > 0) {3 X- @( i3 N& ~" S! p8 f) l
queue.addLast(t);
$ K" y$ o& S* z0 ?& T! L/ T# V }
5 [8 `/ X) Y# v9 ?0 `' I$ G k = (k - 1 + queue.size()) % queue.size();+ v0 d# E4 S1 s2 m* N# [3 S9 w, ?
}! ` z9 D( k! a: Q. Q8 B% [
return result;. h/ {, q d' i; O `' q
}) K7 d3 B% l" Z
}
: o2 c( E) d$ k7 |
2 r+ H+ i# C* b, q! w2 e, ~0 Y【 NO.2 反转偶数长度组的节点】
, h. s* C, e4 @/ o% @1 }5 D3 G# W. E: `/ r5 e4 m r$ O j" _4 p
解题思路
0 w8 Q$ u% d( @+ S, b数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。& R8 _; m# v; @2 C; e& [! M9 t
. R- N: u) s9 e' j
代码展示" A2 |! U5 U5 e+ H2 j0 f
" x+ f( _8 j. j8 R1 \6 G! ?* xclass Solution {" k8 n0 @! ^+ Z
public ListNode reverseEvenLengthGroups(ListNode head) {
1 j. J4 ]" N/ j" e0 D& B9 f List<Integer> list = new ArrayList<>();
L+ E4 \! C$ r for (ListNode i = head; i != null; i = i.next) {
' |. O) q$ d5 K4 b% r list.add(i.val);
6 j: Z' B, F3 n( Y2 ^ }# Z7 B/ \6 K- c: A( Q1 s/ X
for (int start = 1, len = 2; start < list.size(); ) {9 g, z; R% }6 ~/ J9 c
int end = Math.min(list.size(), start + len);
. k4 E7 i! J. C6 g! V* _- [ if ((end - start) % 2 == 0) {) o# j7 Z$ V$ j/ ?. \9 Z
// reverse [start, end)5 S5 s- c3 N" \/ C; `
for (int l = start, r = end - 1; l < r; ) {
$ e% n6 o& i: q: \* f2 ? int t = list.get(l);& ?8 `9 x$ }/ W8 B
list.set(l, list.get(r));
0 n0 E( `5 s& ~* ]5 f$ [5 ]' @ list.set(r, t);
i. e( G4 B0 L* R' R& H/ I' m& p l++;5 l- t& w/ F$ c* i" e/ D D( _
r--;" m9 j# Y+ q, ~4 T5 u5 g% ?
}- P2 z6 X. Z; a( V) q
}
: M0 a: W. l: }( C1 P4 V- D start += len;+ O. }, A! @# V) c$ L1 Q$ {
len++;# Y) B2 J- w; S7 j& p A
}
! Q8 T) Y# ^7 M0 C7 B ListNode h = new ListNode(list.get(0));
) L: ~0 t( `9 B' E7 A ListNode cur = h;
0 t8 N+ r& y+ x for (int i = 1; i < list.size(); i++) {! o& ~3 V9 O: W7 t: ]7 Q
cur.next = new ListNode(list.get(i));, N: M: g6 ]* v1 v' F5 m9 M
cur = cur.next;
" |+ h9 ]. Y7 z3 k# i( x1 h }
+ f% }3 C' {- n return h;% v5 C. B4 T$ v+ c/ ]9 a1 e
}; a' L7 f% b. F j
}
" P9 |9 g7 k- d+ P9 s; F
5 j1 f5 m P, J【 NO.3 解码斜向换位密码】
: J. I# W! d( ?9 E5 S8 B% `! G' X) ]& @5 P* S3 p8 c' E3 V
解题思路$ x$ z; S* d& _, ^7 n5 N P
还原出矩阵即可,最后注意将后缀空格删去。$ l- L# e A! O9 F+ H, p; J" T
" F) O+ n) M- a代码展示
- @! s& o3 D- [/ w) J
! t+ s0 Y; f) H. H$ ?, R) fclass Solution {
3 m1 y& I" c2 `6 v) R/ \# x public String decodeCiphertext(String encodedText, int rows) {8 J+ @2 r5 }0 Z: O/ Z; C
int cols = encodedText.length() / rows;
& n+ R6 f, J) {" R/ J& z char[][] mtx = new char[rows][cols];+ \% P7 P2 u. e; r6 M' p
for (int i = 0; i < encodedText.length(); i++) {
# N# t$ E* ^6 o6 y1 z, q* E" O; j int x = i / cols;0 ?' B3 d, _" u, ^* C( G( ?
int y = i % cols;( u' |; ?9 v3 T" V( L
mtx[x][y] = encodedText.charAt(i);
+ p! ^& M# U/ _, U& p# _ }3 x5 H- Q1 f0 D0 W
StringBuilder sb = new StringBuilder();5 |" M, s) m/ x; k( O
for (int startY = 0; startY < cols; startY++) {( {2 j+ j2 C2 n* |0 }
for (int x = 0, y = startY; x < rows && y < cols; x++, y++) {1 F8 t+ s6 O2 i8 i1 p; ^
sb.append(mtx[x][y]);( Q" M' D/ H* V
}
2 \- g9 z7 |9 t3 z& u! Z! Q* }% ]( w }3 u4 T; `2 g2 g& N: B; _7 E& W
while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {
1 b- ]) w0 L2 T3 W2 _; Z9 \ sb.deleteCharAt(sb.length() - 1);2 F5 [- I9 |* H0 t% h- \+ m
}) P: B, Y9 W/ g4 m9 G* ^
return sb.toString();5 \3 I3 m6 c$ a% Q' y5 I* H
}
/ {, H9 E+ m! `9 t}/ _! I' K- N+ I$ z. f
/ N/ |# E/ w, u! y+ _
. k3 N% J9 q. H# {: L【 NO.4 处理含限制条件的好友请求】
5 L1 W( Y: `& _ c; x
* J0 W2 W; Q7 `! \, W. G解题思路" A3 {& F( h* b' [- B
并查集,详见代码注释。0 I5 O r; K, p# {% @
9 e! \1 t6 M# {+ `9 s2 E) I代码展示
: ?1 g* w% h' v% l! e) K7 `2 p9 J
class Solution {; ]1 Y2 M/ d8 r2 j5 u, h/ J
public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {
1 ?& m" |3 b, K$ O$ |4 Q0 W boolean[] result = new boolean[requests.length];; h$ b# }* G- i
// R[i] 表示不能与 i 做朋友的人
; }$ i& e8 Z5 {% W5 Z* Z List<Set<Integer>> R = new ArrayList<>();
/ X, Z7 m1 i! l: E for (int i = 0; i < n; i++) {5 y$ P# Y0 u3 Q: X5 V# e
R.add(new HashSet<>());
2 y; ~( `" n; A! B$ @ }
. u9 e {8 b$ l" _% r for (var r : restrictions) {
: O; b0 Z1 c3 u' _ b; u; L R.get(r[0]).add(r[1]);
( X5 T( t4 t/ m+ ]& i; q4 g R.get(r[1]).add(r[0]);
* v8 U. [" W8 R/ u: x }
( b' F' T5 U5 \( f! r& l // uf 维护间接朋友关系9 _% U9 {) A4 i/ s$ L; D
UnionFind uf = new UnionFind(n);
9 I3 a2 I2 |& R0 u+ W2 v for (int i = 0; i < requests.length; i++) {
8 F% J8 ~% Q/ g var r = requests[i];
& f# x1 d! A% V6 i3 `% j% W int f0 = uf.find(r[0]);
0 t/ \0 L7 x5 c% D y int f1 = uf.find(r[1]);. x7 W2 w9 n: y3 Y6 \0 a% H$ r9 K
if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了1 c: A2 \+ E* ^) q1 g7 [
result[i] = true; y$ Q9 [- l0 u+ Z2 B. D; {% ^
continue;3 F0 e+ a' E; N9 l% Z
}
( i5 N- @- u1 c$ }3 V5 `) ^ // 由于我们总是将限制关系合并到根,所以只需判断根节点即可
5 {" X/ ?; z; Y+ X3 R result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);
% T6 h+ ^ j+ Y5 K9 n$ B7 H if (result[i]) {( N- h, ?$ ?1 j, \% M+ ^5 h% p3 f
uf.merge(f0, f1); // merge 后 f1 将成为 根
+ D- L- n: i" Q! }6 ]% ^; p$ p // 原本不能与 f0 做朋友的人也不能与 f1 做朋友了
: u' R0 M8 V; ^$ z0 x) e: ?# |) K R.get(f1).addAll(R.get(f0));
+ [0 Y( u+ [! M. v/ ^ for (int j : R.get(f1)) {) Q$ a. L4 e: c' Y P
R.get(j).add(f1);3 O/ Q- q; D8 x6 Z
}4 W' D" l/ t4 e( V* L! x, u/ x! d1 {
}' m2 H |! [) q# ]9 j1 E8 M
}
B" J$ l* D* `. y5 w4 j+ P return result;/ F3 B, Z" B# l6 a! \* D9 L
}6 O) ], U% W) t$ E( e
}
8 p. z% ^% q, ^1 { }* N; @3 T3 Y9 ?, o% Z1 @5 F
class UnionFind {
, X! Z3 G9 d; i6 N public UnionFind(int size) {. [7 `4 K3 M$ O- s- A# ?; D( L
f = new int[size];
4 M e2 J! G- r Arrays.fill(f, -1);& ~1 r. S& ^7 r! }& a- N4 F
}
* {- y) R3 V! ?5 e5 t+ M" X( H9 {6 C: n) l2 `4 f; O
public int find(int x) {7 X: n* v1 K x
if (f[x] < 0)
3 ~8 x& P7 l" C+ w. l- B7 L return x;8 x4 p; d* w& f. A/ f: T3 L
return f[x] = find(f[x]);8 I" p g; n( f" ]
}
+ w O j" Z( y
" Y+ ^! p; k) M5 M1 ~+ P6 d& L public boolean merge(int a, int b) {
; a0 E. S; D( x' J% w int fa = find(a);9 Q' R- I6 E3 Z# f7 b2 Q$ ?
int fb = find(b);
/ L0 H I. C. M6 J+ r if (fa == fb)- b9 Y ~: |" G5 f3 n4 r& r7 C
return false;5 i& ]6 P4 n( E
f[fa] = fb;& r/ u8 ?; u" K, W- t$ t4 w
return true;/ f+ ]; E1 i4 W2 z2 c/ w
}
& W. o+ O# ` {9 g( y
. i; [9 t& @! I6 o0 e public Map<Integer, List<Integer>> sets() {
: S9 A, ^! E+ f" @/ j Map<Integer, List<Integer>> res = new HashMap<>();
% ?8 q! j2 x( y i: I: X$ C/ g4 g; o for (int i = 0; i < f.length; i++) {! D1 s) @% \$ B
int fi = find(i);
: Y. f% {! h6 J5 } if (!res.containsKey(fi)) {) z2 ~% T7 d9 |- ^2 ~
res.put(fi, new ArrayList<>());
4 G) t$ @: h$ I" R7 W, n: H }
- @, r% w8 ]' a6 v' V res.get(fi).add(i);
4 O# U ?, f4 z* D6 f. h }$ D9 d' X h' v! q
return res;
' \% \( f3 r' H6 Z: g6 b }
. {6 ~% x' L7 b/ N ]
& E3 m& @% c; @9 `6 l5 h5 o( J0 h private int[] f;' s/ f: d! Q7 _7 V- f, J, ~6 u
}: W- K) b6 d1 P) E& i3 I. A3 C
|