登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 执行操作后的变量值】) b, L9 s) r) E3 A0 l2 V
解题思路
+ ?1 Y) C7 s S2 O* E: a签到题。0 O4 f: ?$ M' ^! C+ O% y/ g
0 \7 T* G2 z, e% O" q; v2 R
代码展示
9 g* x! U: @, ^) {. \
1 p& Y6 A% F$ x$ Yclass Solution {) ~' @5 a% i( l' n/ I2 R P
public int finalValueAfterOperations(String[] operations) {
3 C3 _, S, l2 m& a# B int v = 0;
% c U7 k" N8 Y% v b: n for (String op : operations) {
# y0 E4 o; ]. b) b+ j. a if (op.contains("++")) {% P6 V- B$ x# z' }, n6 k) M, N; {3 b
v++;
8 s+ L5 @" E: }# _7 J4 J' ] } else {: x' r8 m4 }% A0 e0 h+ B! i
v--;
) r6 b% R) M9 n9 z4 f }, g9 B. n8 a D% [. ?
}1 n3 |' z* ~! C5 {9 g/ o) E
return v;0 K$ q& \9 b3 Q- Y
}
% e/ Q" M; _! ]& S}5 X% a* v7 b6 j/ \9 b
& P1 i" c1 x! z0 _% W! m【 NO.2 数组美丽值求和】
# Q& `% L& n1 i. q6 e- G! M1 \. U1 G! s4 `7 W( C
解题思路
" \+ _& S' S* \4 g7 C由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。
/ R- s7 o1 Q$ Y& l( Z3 ^, q
1 `& c9 t( K2 A9 A& A7 Z代码展示
2 k0 M% v2 D6 G6 y5 ~3 [
; E* B- j9 v$ K) Vclass Solution {
/ G0 A, e7 X" I; A' I! [3 j8 u$ O$ O public int sumOfBeauties(int[] nums) {$ g7 S9 _0 _7 I8 f- A( f
int[] preMax = new int[nums.length];
) Y, f6 ~+ U" S- L9 ]; S preMax[0] = nums[0];
; o/ z( t4 m- R1 M8 O4 H7 N- n for (int i = 1; i < nums.length; i++) {2 j" B- E" ^4 A( L# P% R
preMax[i] = Math.max(preMax[i - 1], nums[i]);
7 e& A" ~/ f$ w/ I: E: L }+ W) E' q4 q8 ]. Y9 a
int[] sufMin = new int[nums.length];
) f' A- s/ b9 f sufMin[nums.length - 1] = nums[nums.length - 1];! s% I2 x9 f' A/ i& v' F3 X* C- C
for (int i = nums.length - 2; i >= 0; i--) {' C; z* X8 v( j9 @- e9 p
sufMin[i] = Math.min(sufMin[i + 1], nums[i]);
1 i; @3 V6 m( M5 w' h9 w }$ M. V/ w. v5 J e
int res = 0;
, ^- A; t0 {% D* z for (int i = 1; i < nums.length - 1; ++i) {
- k4 x) b% v3 U6 D6 [5 S, h if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {( \' I3 R: \$ ?! w
res += 2;
. G q9 a2 E) s8 @ } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
# b) L2 q# g: c res += 1;! R) T6 @; Y) O" ?( D6 m( n; ~! w
}% f( t: t5 | ?, M
}
F0 c: h: ]5 {0 ? return res;
0 @' t& |4 g# e2 c }: N. S. t5 ]% o: P1 I X
}8 D# t9 h& Z; n. p+ [; [
1 z$ W2 Z6 p$ r( e) T+ Z% Y【 NO.3 检测正方形】
6 P, J* r5 X+ o; o! V. K/ o
) n$ L5 y# g$ r6 L% i* J1 T2 Q5 O4 z解题思路3 F5 I" C( p T* O3 b/ n
使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。6 K8 @% g6 Y, e. \
3 ]' S- o: [ @9 v
代码展示& T3 u" z6 F% g4 T; ?
5 d/ s6 W# k& @1 Q' N% F
class DetectSquares {
0 e, }1 N/ L/ Z! H* ?# k/ V7 h) u
Map<Integer, Integer> count;
! S8 O R9 q" h; M: s9 u1 C+ B
3 u( J7 t2 H9 R8 I* n( t public DetectSquares() {# n& W2 X3 h9 o7 e( Y: P2 C/ P
count = new HashMap<>();2 \6 L. c% [% i
}
. Y+ e$ ]% t5 ]1 a- J; U- T
* \, \* \* F, C" v3 t" P public void add(int[] point) {( m( p7 X2 n+ R; O \3 @& j
int c = comp(point[0], point[1]);
/ a4 W) i2 z. P7 C count.put(c, count.getOrDefault(c, 0) + 1);. k; X( r% ~5 t2 g7 U: n* ?$ L
}
0 `) q9 Y: G' W* B' B8 f6 k m
- Z) M$ F$ Z$ b7 u: l5 X public int count(int[] point) {
- Z j r, ~" _6 d1 Z* r int res = 0;
$ W, b% H% }6 w* h+ j for (var kv : count.entrySet()) {: t$ v7 q' e$ ^+ c% H
int x = X(kv.getKey());" b6 y. e5 o6 [$ |8 b
int y = Y(kv.getKey());
: T" H* P5 Y1 x if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {
1 F) ~2 Y% y. A0 P- {0 L res += kv.getValue() * P& Q N0 i0 P, F5 R( b" o
count.getOrDefault(comp(x, point[1]), 0) *
* T& N4 `7 n. B8 t0 l. V0 V) t3 D count.getOrDefault(comp(point[0], y), 0);
$ ^* ?: ?# {& ^/ h9 `/ Q }6 f- X& d x0 }: w
}
9 }) ]% H1 `# ?. G% P6 M0 v return res;) W. p8 z& b+ W% [( u% r% I- G8 q
}* t* B# a+ E( E. E2 @7 \
7 r9 p" s' P; g; h- N4 _
private int comp(int x, int y) {- @7 ~; R* w8 ~; ?2 l+ V; h, [
return x * 10000 + y;
" M0 n6 N0 G G4 a7 _4 h$ { }
8 w9 ^- a2 a# i& Z4 }0 I( U4 J1 n5 T
private int X(int c) {/ \* m* E5 ^' ?
return c / 10000;1 v9 R' \- d, g% c- s
}
3 Q" }+ D% b+ `" Y8 J
+ s9 z: j7 ?8 S private int Y(int c) {; ~; W. \# [- w6 v. w8 l
return c % 10000;
* A h7 C ~5 Y* K/ I }* Z2 `: \6 @. X
}
) r) O! G, u% o( v) R. U3 ?1 N) [5 j
【 NO.4 重复 K 次的最长子序列】
: o k6 P* K7 ~- G( e, C* c. ~+ J( |
解题思路" T8 A B8 ~7 u( |) B! Q
注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。
2 z$ n: k7 H3 ]7 U" U3 Z. k. E* c9 i& w4 ?4 Q
我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。' H9 U& x5 a5 d0 e% u
& S4 V e, v, M
代码展示
/ m' E1 u; E1 X. M/ x) w* y. t& e6 [; R7 b) b" G
class Solution {
3 H- }8 y |, p# _# ?! L/ J public String longestSubsequenceRepeatedK(String s, int k) {5 T" S- ]* F& L- R6 g" Q! |6 x
Map<Character, Integer> count = new HashMap<>();
; ?/ b* d( P7 _ h/ B, @ for (char c : s.toCharArray()) {
% g2 o8 g5 h3 f- u. d# f count.put(c, count.getOrDefault(c, 0) + 1);
. u. o- u" b& G9 T }
/ b! w' e/ U+ e: R. F StringBuilder s2 = new StringBuilder();- ^ Q/ L' i7 B# p
for (char c : s.toCharArray()) {; B) v% b; s. f
if (count.get(c) >= k) {+ [( L; H! C; d. Q8 O- w: O. X
s2.append(c);
- N' J; J* {0 X }
8 [; |: i% D6 M) v3 N }( B! O) \$ V! W8 j) X3 m R
count.clear();
# [( S, w2 ^2 _- b- p for (char c : s2.toString().toCharArray()) {8 _4 H( Y) W3 E
count.put(c, count.getOrDefault(c, 0) + 1);% b7 T6 U; d9 E; y( A$ \
}, n$ f7 {( c: c2 o2 v. K) ^* t
return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);
: K% z8 u* B( T2 q }* b! D: {: ~/ u" ~+ t
$ J& W/ S- ~# `* r
private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {
' E T' {, S- E% F String res = "";0 j) H% \5 ^" S9 C4 @
var keys = new HashSet<Character>(count.keySet());* [$ ], M, d. I8 \! g
for (var c : keys) {' g% _4 i9 R( C- e( u, l
cur.append(c);
' [3 s8 P2 C7 P if (comp(cur.toString(), res)) {, q5 b6 u, [3 h* Y: s) d0 ~& O
int cnt = 0, idx = 0;
; l& j! p+ w4 R" C( B6 Q for (char cc : s) {
# R0 L2 r4 `; y6 M: w# z if (cc == cur.charAt(idx) && ++idx == cur.length()) {/ Q9 l$ `, y: g* R
idx = 0;
! ?/ b. X f/ U6 }: x if (++cnt == k) { O% s N* N" ?* F% O
res = cur.toString();
2 q1 S. |% |* ?' v/ ~- S! {( @8 E7 I break;
: D5 T0 c$ _# H2 c# A M) _ }
) O* }- q0 U7 Y4 v }8 f" p- {( Z, y$ ?$ h1 I
}
- i {# I9 q! _" U i3 ` }
. Z& n6 m" i+ A3 [ int bak = count.get(c);) V' u6 N7 p: h! L4 `
if (bak - k < k) {9 m0 O9 p+ x1 z; j
count.remove(c);. J t2 R) G+ ~5 w/ G
} else {- j! e" b6 k- I5 n* m
count.put(c, bak - k);
/ b8 j9 K: [2 V }7 k7 e$ U: `7 C z7 Z6 S% S
String r = solve(cur, count, s, k);
: V& @! o( i8 z0 H* U& O1 u" E if (comp(r, res)) {( P I- M- E& O3 q" J& T( \
res = r;+ D( ^4 r4 E' [9 k
}; [1 F3 c- W! |& W% N' ]
cur.deleteCharAt(cur.length() - 1);
( B* y% m: j9 V4 t4 S count.put(c, bak);
) ^: v2 |9 O% a! V$ u. Z5 o }
7 E/ M3 w" ~( v' o \3 @! e: T7 y return res;% V0 q9 a% o5 o9 m) Q( ]) ~+ N
}/ q R+ j; x: s, w/ `+ [$ m7 d
* o7 o2 E% y5 J n6 _- g' T( K
private boolean comp(String a, String b) {; k8 H" c: a3 C4 k y$ ]
return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);) b6 S; L( S; P( t6 x& z; `* [) F# [
}% \) K/ V0 Z1 x( x. {4 v, S7 a
} |