登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 执行操作后的变量值】% o3 C; `: H' K# S/ C
解题思路- u0 R( n! ^4 D+ z1 q' y. i
签到题。1 a4 S0 _0 }+ b6 `/ {/ F+ W7 ^
$ q5 e8 F# o" C# K4 G$ b
代码展示
/ B& _. @2 y. O4 V2 D8 _+ Z
+ [) [, l) l0 F: L( Pclass Solution {0 r5 l. z/ f) c2 c6 `
public int finalValueAfterOperations(String[] operations) {% ~0 A) o4 S( o/ H4 I/ H
int v = 0;
9 q# ?1 w; ]8 S, }4 H4 R# r for (String op : operations) {
8 F3 c3 p! i' N if (op.contains("++")) {
! r2 ?. f; H8 v" ~ v++;
( e8 v6 z; y0 o) q' I$ d } else {
. [* Z- d$ p; [ v--;% K2 d8 d) R/ v4 c
}
$ `5 a+ e9 Q& V5 [# W! u* q, ~ }
1 C" d2 l9 @. O7 H' s/ K6 J return v;9 o: j) Z- e3 o2 H! b
}
3 @" Y" h6 b+ p' Z9 E2 h6 N}
& r& n! Z" x& p' B' S r; H, s% `) z! n" A' g& m7 X
【 NO.2 数组美丽值求和】! ?5 E7 R9 P5 b3 `( v* `
( q: V5 o. P$ x c2 T( ]0 w5 [- x解题思路
) J5 D" `! h4 `7 P由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。% `9 x4 S' E. f! ~) S2 _
& f+ F. I8 {4 G- O" o9 ?9 ~, K代码展示
5 l9 I& Q6 L* ^0 ^7 Y
' D, _7 b& H+ D, Q+ s7 x! L! n: kclass Solution {
! ?* p: v% @7 ~5 ? public int sumOfBeauties(int[] nums) {
" v, C! h! g: ]7 t% K int[] preMax = new int[nums.length];* ^7 \1 b- I; S& O
preMax[0] = nums[0];* z# C/ J" n$ A3 ^" |$ o1 r
for (int i = 1; i < nums.length; i++) {& o* i& H) X+ f! I
preMax[i] = Math.max(preMax[i - 1], nums[i]);
Z( Y* ?/ G1 `! N8 ?3 ? }
$ D) n3 |+ l3 P" a# @- S: ~ int[] sufMin = new int[nums.length];* w0 _% V7 M8 Z$ h' ~
sufMin[nums.length - 1] = nums[nums.length - 1];; s6 V; F9 Z% l- o9 c8 F- P
for (int i = nums.length - 2; i >= 0; i--) {- K& P. g+ L) i8 P" s
sufMin[i] = Math.min(sufMin[i + 1], nums[i]);
) G! e$ U0 b9 d5 _+ N" W1 K/ h }, o+ J9 V; |0 A/ L
int res = 0;
$ _2 U( I% p3 ]4 x for (int i = 1; i < nums.length - 1; ++i) {
/ w' j3 W/ K- Y8 _5 y if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {1 X4 D& E6 c' m3 u ]1 s0 P
res += 2;6 P+ o+ y/ r+ ~' I' ]
} else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
: G h! |3 w8 H" P! k0 ]; D7 e* P res += 1;
6 L% W- {) R. `% `5 ] }0 Y: I/ n3 \: W( J& w/ E. O
}( O# v6 C/ w8 t4 [2 N" m
return res;
( u( S& j4 U7 J( w }
6 Z2 c5 K" l* C* i8 H} G" `& H% A e" j' }6 J4 H
7 X. e) F) S9 t+ R5 k; o【 NO.3 检测正方形】) L1 s! w, e/ y5 D& t O
, n/ E/ P; r- T7 o8 r解题思路3 r& K& d- H J" c h- L. m
使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。
, D0 H, q) w0 z% B
3 ?; S) f" h; T代码展示
~5 F" ~# ~( ~5 ^* A( c# v" v; ?5 G: c; i2 F) k
class DetectSquares {/ _/ `" g0 F8 D+ i
+ ^' l) E. c: g" Z5 |. k Map<Integer, Integer> count;3 N2 X0 q3 ^+ w
Q! Z( b" X3 N1 l; Z
public DetectSquares() {2 V2 c6 }" ~0 _$ A
count = new HashMap<>();
7 g1 @. \* \' _, ?& J3 `2 a! V* [ }7 T X& I- v$ M9 ?" J v+ E$ p1 c
/ H& C! e- J$ v0 T
public void add(int[] point) {7 B4 ]6 R) Y8 I1 e1 s$ Q$ t
int c = comp(point[0], point[1]);- n& @5 ^$ s% J. V$ S! r7 e
count.put(c, count.getOrDefault(c, 0) + 1);
' t0 x K, p: n; ] }( t9 W: Q% n: n( k4 C2 P, `
3 w% z: T! j5 s" C; W; @3 f0 u& y public int count(int[] point) {
. q1 g! ~) ]3 G. I int res = 0;
7 P8 n0 S1 ]" \1 ? for (var kv : count.entrySet()) {
, p" E/ X0 ?$ e5 X4 x& G int x = X(kv.getKey());4 V0 ?5 |* d: S- m4 O0 ^
int y = Y(kv.getKey());8 G" ?: Q, t* O# D: g7 R' H+ P
if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) { J( c) r+ S# e
res += kv.getValue() *
& Z2 s' d: q) M1 E count.getOrDefault(comp(x, point[1]), 0) *3 h4 b+ B8 ~- z# K" K$ O+ X: {
count.getOrDefault(comp(point[0], y), 0); y- Q. X3 y9 `- V
}
& T, I$ {$ J1 N; G7 }" o6 @/ ~. G9 M }
& @, X) V9 k& F7 _ return res;
1 A* l* b8 X/ a- j" d! d6 ^4 } }
6 g3 \% K6 j: M/ K4 ]7 x3 ?+ |/ a' `4 w: d& ^9 P7 q6 m: @+ T
private int comp(int x, int y) {
; q9 t5 }+ F) m$ H2 w9 c% C return x * 10000 + y;$ C) c4 `$ P0 A
}
# Q/ P+ \* Y- w4 Y
7 s9 ^8 b" g; ^/ X9 x' j private int X(int c) {* m: L) i5 j0 u- B' [
return c / 10000;) I4 j* E( ]9 y# k
}5 ]9 m, {( O9 X% y+ Y4 _
+ G* j; A* R P7 Q8 c) U! [
private int Y(int c) {) J; z# q; Z! ?# p/ P! t- n- l
return c % 10000;# V! n1 n# S# t2 o1 U5 v9 J" N
}
/ T0 I2 O" A& o; o- F}
8 k2 f6 n- x6 ]$ a9 v6 N6 h3 @4 D- }! ]" @* o
【 NO.4 重复 K 次的最长子序列】
- @$ M: |* n- j% H8 w% `) ^0 m0 E# R, f
解题思路; |# f/ Q" I" p( k0 u
注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。
: V2 C9 V: b8 Q) n6 O7 N# V5 z0 B4 \4 e5 P& M' \- E7 ~
我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。
8 \* |. |5 J3 U
, W$ c0 D% ?% c- U代码展示
C, C9 k' x5 F
* l/ M- R4 d% ` z( y9 g3 \; Yclass Solution {
" f5 T9 l& A. o, f7 v public String longestSubsequenceRepeatedK(String s, int k) {
. @% Z n* C8 A' k* @ Map<Character, Integer> count = new HashMap<>();4 @( P- F1 w! n* s
for (char c : s.toCharArray()) {! W9 M M0 G# T0 e/ ?8 E) |
count.put(c, count.getOrDefault(c, 0) + 1);. h+ @, r! l2 X% W
}4 z" x7 U6 w: }! k6 ?* A7 `' |
StringBuilder s2 = new StringBuilder();
2 v$ ?7 `# |9 g) s& x for (char c : s.toCharArray()) {# K$ ^- {& W+ a6 \3 l
if (count.get(c) >= k) {
# S7 E1 Z* h& j4 _# l: d s2.append(c);
$ {8 ~* f4 E" u' H. | }" ?- W3 N0 v/ e. V* I
}$ _0 h2 r Z+ U9 h" a) t0 [
count.clear();
7 L7 l" @/ z8 V. f3 l% y2 Q for (char c : s2.toString().toCharArray()) {
( v7 F4 ^! F/ c5 l2 E1 `% ^ count.put(c, count.getOrDefault(c, 0) + 1);
6 f& P! {8 r1 ^; d& ^( w }
2 X' V2 \: v7 u1 v6 [- Z return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);
9 c! ~5 t1 l" D! l, h, B }; I3 w3 c$ B4 H$ K4 ?3 M3 D
7 N2 j7 e8 |# N' B' Y/ z E
private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {, L: \( {5 u& t9 b. h ?, g5 Y4 J4 f
String res = "";
2 Z0 P0 A" v* h8 b q9 ^; n3 ^. L var keys = new HashSet<Character>(count.keySet());
4 F; |4 u2 x& W for (var c : keys) {0 O) f" P0 v( W( u
cur.append(c);+ k4 l3 B0 K9 L c, Z1 I- V
if (comp(cur.toString(), res)) {' Y3 N% `/ z8 D! N% d+ y
int cnt = 0, idx = 0;& o: h4 b1 c4 a* B" b5 n
for (char cc : s) {& p C% e+ D) n9 _) a5 [
if (cc == cur.charAt(idx) && ++idx == cur.length()) {6 X/ ^) p) w) v; I3 q
idx = 0;' m. O* ~% d" W/ @7 G* P( [$ W
if (++cnt == k) {
3 `" p! i& |7 P$ |/ k res = cur.toString();
* Z- v( k& W7 K" @( j, b break;7 S/ U6 z2 n. t2 H/ a: W8 d+ D
}3 h: R1 |) r8 j- K& h7 N0 l2 [
}
9 \" Q7 X8 K( }# Q7 S( g6 _: M }' s' T) T' R Z. Y& r' W2 v9 c
}
0 o4 v) {2 a. J int bak = count.get(c);
+ ^& b9 H; X: }3 [/ [8 L if (bak - k < k) {
4 U9 {! ?: a& h$ q4 o' j count.remove(c);
! [& a R& Q8 C } else {
- w* v5 q6 Q8 u- ]" i4 d# M2 p count.put(c, bak - k);
* j/ s1 c# s' ^0 e }
4 q6 C! w2 |. E4 c- [9 `$ T String r = solve(cur, count, s, k);
$ G8 l* M1 {! V! c$ J* ] if (comp(r, res)) {
5 o* z; ]' P! V9 d/ n res = r;
7 n4 P$ _0 X5 Y0 s }
( h+ `7 p& W, Z4 [4 i cur.deleteCharAt(cur.length() - 1);) `4 P8 m* V; _: A+ G P' z
count.put(c, bak);6 u a' _& v4 h# K/ t
}
4 B% p r: ^, d3 }; r, C; C return res;5 s4 ?# Y7 D# d. q# s. C
}
* Q$ I t# v/ t
8 {. G5 Y3 ^3 D; R2 p private boolean comp(String a, String b) {
- \+ R8 H# C7 B% a return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);0 b1 I/ K g' j$ F
}; @9 n/ z& V4 g& a( T6 y' E. p
} |