登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 买票需要的时间】
; _% l# o( a9 l4 Y: L4 L0 ^: z7 s3 N8 z/ v) s- R3 T
解题思路
3 L. o( V( r1 {+ i4 Y& A签到题,使用一个 LinkedList 模拟即可。3 N h: H) M; b* ?5 E e
w4 U; q( u |& N
代码展示
( [; S1 b q. @/ L" s# d: w
7 l6 f& k. b& t! Iclass Solution {/ L/ j, A% w6 @
public int timeRequiredToBuy(int[] tickets, int k) {8 S: H7 _9 @$ s9 {. Z% ?) t
LinkedList<Integer> queue = new LinkedList<>();
( _( U* C# C7 K; d8 H7 k8 ^ for (int i : tickets) {
8 F+ Z" |3 H( |" j: t/ z queue.add(i);( a. @& ]& @/ ?- L3 U, L9 ?, K
}0 a6 J, A3 n# h, D" Q/ c; o! A
int result = 0;
7 u' z0 p, E0 r# | P while (!queue.isEmpty()) {* k0 @1 F1 J4 `( D& B' W7 \* S6 g
result++;
! Y Y, M1 Z& _/ x int t = queue.pollFirst() - 1;
5 _9 K4 \! F+ p/ C: {7 x1 D2 I if (t == 0 && k == 0) {2 A* O$ D* C/ l
break;
2 y9 S4 z( }% a6 Q# L }
* T; e- c3 G6 k- D if (t > 0) {
* q3 L I3 i$ Z+ d$ U0 S" X queue.addLast(t);
9 k9 ]3 n3 A" X% y. E }
8 Z% G' b Q" t1 {5 { k = (k - 1 + queue.size()) % queue.size();
! c" n/ D; [+ \/ e, Q4 T. c$ | }
' j( W6 B( H. x2 t4 p* i; o return result;
4 n r! |7 W1 C6 |" a6 j9 Y }7 i( b! C3 p$ W& G+ W
}: D: M; `) _/ g
$ c3 o- ^* L5 y8 ^5 }【 NO.2 反转偶数长度组的节点】7 E( Q9 K" e. o( o. c
# [: l5 @' Q; i8 v解题思路
2 E# ]6 X4 g# Y* a" H* T1 M" o数组更有利于反转操作,可以先将链表转换成数组,操作完后再转换成链表。' }7 z$ h. t4 T- D
$ O6 ? M8 h6 V
代码展示' }4 G& @; H1 L% x. h0 \& e+ C
6 j3 h# U) t3 m# o" vclass Solution {
. G3 X. e W! t3 A% y: ^, ?" h* c; a public ListNode reverseEvenLengthGroups(ListNode head) {2 y. e2 u6 ~5 N+ @& l
List<Integer> list = new ArrayList<>();
2 D& Q( _$ S0 w5 a* i1 r8 z$ H( f for (ListNode i = head; i != null; i = i.next) {# o; v# `. `! l5 o" S, c$ @
list.add(i.val);* A: I# [+ g3 @1 T& f
}
3 r9 G: y( l' D; r5 k for (int start = 1, len = 2; start < list.size(); ) {$ u( l8 ]! \' s% o
int end = Math.min(list.size(), start + len);+ O( B7 ?* A3 x2 i1 @
if ((end - start) % 2 == 0) {
* R) x3 x6 _- d: p1 v# l) ]9 v$ u // reverse [start, end)
! @! B, c" r# z5 \, s for (int l = start, r = end - 1; l < r; ) {
/ |, i! y; \2 X! X" ? int t = list.get(l);1 k" W; q/ p8 ^* e- B/ V
list.set(l, list.get(r));
' H3 {+ w, _3 X3 z, a list.set(r, t); G. k% Q5 ?3 W7 s
l++;. [) b# \, N% O* E
r--;" }. R9 k2 x" o9 I5 b7 H* v. [
}1 g. _( o3 c' a: M: [
}
' j. J& f0 o Z0 {! W start += len;
! @- \& h/ ^ ^ len++;
4 t2 q- F5 ? ~) L* q }
# B1 D3 X9 Q: B( D0 u* U5 z1 u# B9 @& E ListNode h = new ListNode(list.get(0));
% {3 E Z+ q/ Q% n3 x( e ListNode cur = h;
5 K# ]/ z' H# H# e+ g for (int i = 1; i < list.size(); i++) {8 K# I' P* v) f- u
cur.next = new ListNode(list.get(i));
7 U1 J: s. D/ g; `: {4 I, A cur = cur.next;
. u7 N3 ^5 s5 i: X+ B( |' B }7 }2 r( n) i( z' K# o9 @ s& i
return h;( d/ M; k/ H0 h# y5 r9 y+ _$ D7 l
}
( o$ |$ X9 i4 X( a# c ]0 @}
: H% O, n7 x; ~% q* t# f0 p2 a8 V1 H* F% E
【 NO.3 解码斜向换位密码】% I' ]1 M* F. b6 [. v* P/ N
* m: }1 ]$ B+ X
解题思路
: B( R: i* I9 A$ h) m8 S9 [* ~还原出矩阵即可,最后注意将后缀空格删去。! M+ K ~% _) d6 _) w7 K$ n
# _ L7 x: ^& _9 T
代码展示
( v4 w1 K6 S4 i Z$ f& \
1 R/ o' Z- K& yclass Solution {* n; U& |0 y3 Q
public String decodeCiphertext(String encodedText, int rows) {
0 J: L( m9 m0 R1 g/ Z o! N int cols = encodedText.length() / rows;
' x# g. ]! `5 D' m$ d2 P H char[][] mtx = new char[rows][cols];
) E5 X. e7 O5 Z; q6 b6 W for (int i = 0; i < encodedText.length(); i++) {
4 N( D% Z, e8 x# U! m- c int x = i / cols;( x) w4 o. v; L3 l
int y = i % cols;; F( w, r& t# A$ U% O& c
mtx[x][y] = encodedText.charAt(i);( i$ T' g3 N5 o/ K0 {8 w3 }& s+ R
}/ D' K5 m# u R. O
StringBuilder sb = new StringBuilder();
" E2 {( ~* K; h8 k for (int startY = 0; startY < cols; startY++) {: q- a' H' K* \$ D9 ~& {3 K9 _
for (int x = 0, y = startY; x < rows && y < cols; x++, y++) { {$ A# x" z; L" }! l
sb.append(mtx[x][y]);
5 c4 G- f& }3 K3 }& d }1 \/ f. N" J6 W- `4 A* n
}
1 K' R7 j. p' Y% O7 {5 E, J+ w while (sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {
# s- W0 Y& h1 J1 ]5 b$ R# g ? sb.deleteCharAt(sb.length() - 1);) v1 B# Z4 h/ ]+ ~
}0 q3 \$ |, D1 C, h6 S0 n
return sb.toString();( s, k! t- f2 o8 ^4 K: J# M8 r
}
8 x4 Y' M* h4 c/ B/ B' R}% A8 _- W+ w8 r( I# n9 w9 e
$ A V& x4 u% V* G
7 d& G: I$ g5 {8 ^$ U2 w/ T/ o3 X【 NO.4 处理含限制条件的好友请求】 e5 _: ]0 a" Z2 [5 \
* V4 w i) r9 O! Q$ ~
解题思路0 V# d' Z# a) Z3 x; x' f8 W5 d
并查集,详见代码注释。$ T+ x3 W, O/ b: A# X7 X2 |
) Q6 ~ x3 H" V: G% U% @6 t
代码展示2 b2 _2 K. i0 ~' {. K
& B1 p- n4 p& \3 \0 Gclass Solution {
& v% G/ g1 w+ M. R" \* j public boolean[] friendRequests(int n, int[][] restrictions, int[][] requests) {: A, a, i- n t2 D: d5 \
boolean[] result = new boolean[requests.length];; {6 {. ]$ J' b* L( {: t; X
// R[i] 表示不能与 i 做朋友的人
% ~8 S4 Y# H8 ~+ b4 p# S1 Y) ~ List<Set<Integer>> R = new ArrayList<>();
. v* T' s; v3 ~+ L; W for (int i = 0; i < n; i++) {
- u# Y6 T6 b* S0 s R.add(new HashSet<>());$ P0 X' B& g' g( Y
}- n7 l% ^/ ?9 J6 V
for (var r : restrictions) {
& d" j0 [( i+ J/ f j; ]: f* } R.get(r[0]).add(r[1]);- K) t9 t" s- N) K8 W
R.get(r[1]).add(r[0]);
! H1 |7 U4 w9 A0 I6 W) V1 L/ G }, t0 T$ O2 I X( P+ ]" j
// uf 维护间接朋友关系
T5 G' u* H, d9 g2 G. r UnionFind uf = new UnionFind(n);
7 `* u) S/ {7 g8 d* Y) W& B for (int i = 0; i < requests.length; i++) {
# p5 W8 T$ w7 W* x7 Z var r = requests[i];6 b `8 J' Q4 S1 V
int f0 = uf.find(r[0]);" e4 Z8 z9 T# @, y5 j* B! v
int f1 = uf.find(r[1]);
, ]5 T: b" H1 j6 @/ e& t0 ^2 k; x if (f0 == f1) { // 说明 r[0] 和 r[1] 已经是直接或间接朋友了, q' \$ c+ X8 S+ I
result[i] = true;7 `6 m, O/ R `4 g: A; {# I
continue;: L, L1 Y: ^ b
}
% c9 A6 _4 @$ F& G9 C U // 由于我们总是将限制关系合并到根,所以只需判断根节点即可# Z, }/ M+ I. Y* j
result[i] = !R.get(f0).contains(f1) && !R.get(f1).contains(f0);) c3 Z4 f( ^! i- ^
if (result[i]) {
! x6 {9 U, H3 ?% h6 k1 Z uf.merge(f0, f1); // merge 后 f1 将成为 根7 X& M$ |- x5 m
// 原本不能与 f0 做朋友的人也不能与 f1 做朋友了
% e. w# L$ r# Y3 ~* P5 T R.get(f1).addAll(R.get(f0));0 a8 E3 |6 K. g! v& E8 L
for (int j : R.get(f1)) {
7 L% ]4 s& z9 j' [( b R.get(j).add(f1);
1 D. _; ]$ @1 Y" F. n8 B }: c. A2 {. g& q3 j
}
" m, X" d5 Q- m# q- {; H9 D }, n# V: c, O4 ]) S( v6 d# ?
return result;
6 x3 Q4 M- N3 E( y }% S5 @! B( `: V4 o3 k @, O" `7 r, S
}
3 V( N! g/ }3 r: B7 ?! N% V# a4 f. O& o! _* g
class UnionFind {
/ t8 B) w- q9 D8 | U: l0 p public UnionFind(int size) {! Y; g$ d7 U# A0 E9 U. e* c4 d
f = new int[size];% y. c& \3 _0 v/ v4 D {" i
Arrays.fill(f, -1);) u+ W- f# [" V' I% t
}
6 A: C4 V. V9 N* Q, \' l, t2 i% c% r$ R2 ?, l
public int find(int x) {
$ k5 v z) ?1 R7 _" H if (f[x] < 0)
. D0 B( L, X8 m) V/ b4 F* K return x;& Q# I+ E' ]: L
return f[x] = find(f[x]);
% M# x9 o' {. r8 m7 z1 E }6 I/ b9 s* f' X- p. }7 Y$ |
5 |$ L( \, N$ E9 T4 ? public boolean merge(int a, int b) {
2 H3 f6 s! |1 S. U int fa = find(a);1 l( d8 _8 G& T; }9 g
int fb = find(b);
: Y/ d# v y) ~+ } c. D" P" R if (fa == fb)
6 h# S- a( W- |/ ? return false;
! c6 ^0 Q0 I8 G9 W f[fa] = fb;
, h/ V+ P7 ~/ G4 b- f return true;
3 R$ V9 C$ N- o3 } }
0 A7 ]6 U( z \' I. M
: z' G0 s7 e& B* w/ [: j9 }0 i public Map<Integer, List<Integer>> sets() {
5 Q( ?+ V4 H. s. Q- h G; u* A Map<Integer, List<Integer>> res = new HashMap<>();6 I- u, S6 G3 _. E
for (int i = 0; i < f.length; i++) {
1 J' n A- }: K3 n4 J5 B# ]/ M int fi = find(i);+ u0 T" @, Z6 A6 _
if (!res.containsKey(fi)) {* Q- l: i! G+ c
res.put(fi, new ArrayList<>());7 k$ X2 E! L/ n1 K7 l; @& J7 o
}
9 v1 ^& a6 N# {" l res.get(fi).add(i);& b' Y2 Y6 ]1 U7 [# x
}' D, J9 V2 D ]
return res;
' D+ l$ [- W E& O% S- L$ x1 ^ }
: ^+ M* |* ]* T: N8 ]: v$ H+ Q* N( n' d* {
private int[] f;$ O1 d1 y6 D1 }+ p, e7 k
}
0 y/ {* @ C' m0 \0 x' D+ D |