登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 执行操作后的变量值】% h$ u- A+ [# y U/ `
解题思路4 g' h; B- y& m' j& c
签到题。
+ F" ^6 s v+ W$ y; {1 A5 X9 d7 }. T; j9 ]
代码展示 }/ Z. P' N: [7 @! d
1 [! K2 ~$ f: Q# Z2 N5 C
class Solution {2 }0 t) N+ ]3 q) R0 r' b- x
public int finalValueAfterOperations(String[] operations) {: y! G8 A/ V. g8 L* ]2 g
int v = 0;- |) r. o3 t4 V- w6 ]
for (String op : operations) {
3 E8 H, c# g! E/ ^% m2 D if (op.contains("++")) {2 R/ G8 Q3 c& I; u& q; A, @. @4 I7 ~
v++;
# G$ f# D+ ^/ L' K @ } else {
4 [. k/ }. O% x) w+ h v--;
" _' D- ]. O8 s# O* d( H+ J }& x# t, t- P+ g; F% I/ r' P v
}2 t7 {9 ^( x0 a8 S2 M
return v;
3 b: Q% C" q# y7 E1 x }- Q, G1 ?) z& P0 l% B5 ~/ A
}
}+ q% `6 m$ d$ m+ Y, s4 @" R5 q s4 K; n, j) u+ R2 R4 C: Q: R
【 NO.2 数组美丽值求和】- g8 _' J- P& `, U' G3 G' d& h
c$ U. R' Q1 ]8 Z$ G3 }
解题思路# Z7 g) J g& p3 h. f( ^8 P
由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。
7 M. G) Q4 J" I0 x! J; z; a# s) O( g3 \7 X5 [& Z7 W% h9 X/ u
代码展示
+ W% x" `9 K7 v7 p3 @" t: X, Q$ P& a, d! T2 C
class Solution {
$ D0 I1 H4 M# V! r; S7 @ public int sumOfBeauties(int[] nums) {; H' p* ?; N4 `$ i
int[] preMax = new int[nums.length];
5 T/ j) R' |: d* W( n preMax[0] = nums[0];- R5 u* [( h/ G3 _5 A
for (int i = 1; i < nums.length; i++) {2 C6 P/ d" J" n8 J7 h! T
preMax[i] = Math.max(preMax[i - 1], nums[i]);
2 g1 `* J8 Z4 ?; d }
& { X- X: x9 } int[] sufMin = new int[nums.length];
( Z& b' b! `& A( }/ B+ K sufMin[nums.length - 1] = nums[nums.length - 1];
! c& s4 A( I5 y$ R/ I2 u- |) H8 n for (int i = nums.length - 2; i >= 0; i--) {# i5 E$ g: g. {
sufMin[i] = Math.min(sufMin[i + 1], nums[i]);6 I2 a9 {5 |0 r) ]8 k9 |- T$ v2 ?
}9 L: z0 z+ P v7 j" R. e5 k# E& Y7 r
int res = 0;
6 S5 E4 N$ X! O0 k for (int i = 1; i < nums.length - 1; ++i) {; c& J& v" l, p# m- h+ b2 N
if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {
/ i. o5 I. f7 B" k res += 2;
1 ^5 ]& J. |% o; K5 Q } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {8 L5 l2 d" F& v( ~* v
res += 1;
. ?9 t' c0 Y' f4 J; e }
/ w4 g0 x# z5 |+ Q6 q r }
1 ?1 [" |+ m8 U" ]" L) O return res;- F+ z/ a5 s* F
}9 b4 p) ?" G2 w8 G( [. U
}
& o' r% v! y" |9 M$ n/ c% g% | s0 M; e: ?
【 NO.3 检测正方形】; t6 z0 e9 I2 R
6 d) A/ E( Y, L9 E7 ]
解题思路. N' ]0 `' I0 C. m
使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。" _1 } i7 `5 `. C- d1 x
# ^/ G* N5 P: O3 ]% ]3 Q2 u. c
代码展示2 i: h; T; j$ m: D( @8 h
8 X4 ~% k# e+ c+ T3 D- { [
class DetectSquares {
, J0 P h+ H7 m1 w
* [$ j8 v1 J: Q9 L3 V# O, t Map<Integer, Integer> count;4 g. M. Z+ q. j# K; V7 w
( h/ x2 v3 a! i3 T& ]* I, C public DetectSquares() {/ m2 z8 {9 u; n9 C: U# x
count = new HashMap<>();
. x& v" d8 J3 i4 e }8 L; R, E0 `& F9 v% M
$ m( a: m( j5 s0 f( H8 {% c" G# O public void add(int[] point) {
) s3 z8 @2 F% q8 H' t int c = comp(point[0], point[1]);/ b+ J5 M: H, x1 k0 p7 L) @
count.put(c, count.getOrDefault(c, 0) + 1);
2 N% u) u2 v) O0 Z: I2 O } m8 D2 K0 r& r/ X8 O
! D2 y5 M! i; E# v8 R( B
public int count(int[] point) {
' ^. w8 W, i3 t- T/ j# O. }: P, G int res = 0;) a6 P* A0 e4 K
for (var kv : count.entrySet()) {
. r* C9 g# W, e8 b int x = X(kv.getKey());( z# m x. X3 l& ^: W0 K$ n P
int y = Y(kv.getKey());9 y) j1 _" _4 w* j' O% J7 d2 M2 N
if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {- O# z* u) l% M) n R; I8 k& X; `
res += kv.getValue() *
" v( ^$ D, b2 ^ count.getOrDefault(comp(x, point[1]), 0) *6 m8 V4 y. p9 j2 @ o
count.getOrDefault(comp(point[0], y), 0);( q/ j' K$ n3 g' C: b
}
; P3 ?( a& w! b+ q: s0 V) T }
% c$ z0 u" d, \2 O0 K& Y return res;6 h5 |) A2 P5 f9 q ?
}( _0 ]9 E" t- w/ J5 G+ A, \) X; l. z
6 _& F7 E& g: u& D; B% L/ @ private int comp(int x, int y) {
) \6 y3 ^# O. A. ~ return x * 10000 + y;
o- b9 j+ M& }( a" A* E }6 @0 M5 @. h6 Q5 W2 O* O
1 b" {* |3 L' V3 I7 W
private int X(int c) {
# K' n# e0 `2 [# ] return c / 10000;
) P$ j6 T' [* Y% { }
' e7 R' R) H' `: N2 D5 T0 ^
; V [8 b3 k* c( p: x private int Y(int c) {3 f1 M' B( q5 g
return c % 10000;- L* V# A# p) N4 u! K. |
}# E% {* u. I+ W5 t6 Q
}1 O; J5 o3 g) h% e+ ?0 V+ Y
& L! @4 N6 O8 O- Z9 u" \( n
【 NO.4 重复 K 次的最长子序列】! ^, O P# E7 f: l$ H- A
' @0 o1 h% Z' x- c4 C解题思路
7 B9 F0 `2 J0 z9 \8 n& M( e注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。( ?$ {: `1 T! e0 G% d1 C8 p
+ o: c) M. d# [我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。: g! U/ _) s/ @, M* X- A
9 x4 P3 \$ z/ c- d) o
代码展示
4 f1 }8 t" G7 U8 t( D( J8 J$ g( S# v; n- r7 M. G1 X
class Solution {
& @2 a; P% W& I! R: p public String longestSubsequenceRepeatedK(String s, int k) {
: g- C+ F: [( C5 X Map<Character, Integer> count = new HashMap<>();
# H, V' v- y. E, i% Z# l0 y# F, r for (char c : s.toCharArray()) {
! E3 k7 y1 a j6 ^2 X count.put(c, count.getOrDefault(c, 0) + 1);, F+ q/ w- y3 `0 X. w0 H
}
0 O& T1 ~- H1 u StringBuilder s2 = new StringBuilder();
" d; ^3 U2 U$ l0 [ for (char c : s.toCharArray()) {
( X6 r/ X$ k( P if (count.get(c) >= k) {
! f8 w1 ^) F( l O s2.append(c);
* }' `+ r& e, d. W }
3 c- l% {1 k' q7 u4 s" j" X. t }( W' Q4 `( I9 L9 i: ^3 A+ n
count.clear();: W8 Y* `; r1 U4 v. o
for (char c : s2.toString().toCharArray()) {! Y4 U9 E2 m { v# b# r
count.put(c, count.getOrDefault(c, 0) + 1);6 {; r4 ^; B& J0 K
}4 U: q9 M; k8 Q7 X
return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);6 R7 r& G/ V" r/ c
}/ M; }* Y7 m8 t) J' `0 z0 ?4 y% O7 O8 W3 c
: v8 y0 i6 l( ]) y7 G
private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {
2 D8 a1 G( ^- u. J# W, @ String res = "";+ z6 W+ I/ H! l: l
var keys = new HashSet<Character>(count.keySet());
" N. G5 G8 e" c2 Y5 { for (var c : keys) {; f4 m; k& A. A$ _1 R" K7 {
cur.append(c);9 }7 e/ o' I/ l% H! ?
if (comp(cur.toString(), res)) {% @& A5 c( \( k. W* z
int cnt = 0, idx = 0;
k* _+ L+ W4 H7 y for (char cc : s) {8 a. ]2 {% p/ E H* C
if (cc == cur.charAt(idx) && ++idx == cur.length()) {
6 O+ k& x/ ~5 f0 k- n idx = 0;1 ~& V3 d u. ^% P: L/ Y
if (++cnt == k) {
8 R6 `5 a" H4 _' E res = cur.toString();
% Q8 k- x7 G7 c$ J break;- z) r: W! i( `) A
}( \2 |& E1 g4 p1 @6 q" h( u7 B* y
}1 a8 |5 p5 K4 h7 N3 P
}
1 E5 Q# N8 Z e1 x6 [, ~% x }
. e) [" _* R" ^9 ?6 q4 p# A4 Y" P int bak = count.get(c);) d" h" j3 x1 O, v- z! b
if (bak - k < k) {
+ D8 A7 u5 S- v count.remove(c);8 Z9 r# Q, P# L7 s# _9 P
} else {
- O3 j6 v1 M$ ?7 A: D count.put(c, bak - k);
6 Q2 V9 ~* F5 K1 ]" `6 { }
7 V3 [! }& I! y String r = solve(cur, count, s, k);
- k& X5 |" S. b" ~ if (comp(r, res)) {4 T! v% E: u" N2 J, W$ U
res = r;. i3 J) j5 S; `6 G5 M7 [
}
% a$ z/ b O) h cur.deleteCharAt(cur.length() - 1);
1 w. Q, Y* B C4 e6 [% H) S. v4 [ count.put(c, bak);9 `6 |* A9 n1 ~, Y. U
}
0 h& b; i2 M$ X2 ` return res;: D/ H2 D( `( Q4 d% \0 H Z
}
4 W* o% \7 f$ r1 K
9 Q2 }5 a) F$ A& o4 o' T private boolean comp(String a, String b) {
7 N8 p2 \4 N( T. Z; [ return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);1 P) I! l2 O& v5 P$ Q" G I
}/ b5 _4 X. \1 K, i( `( V1 K: D: K9 u
} |