登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 执行操作后的变量值】3 ?5 Q) ?8 Z U( n D
解题思路
) `- C% h. Z! Z) F5 F签到题。
. Q7 Z: p2 F: I- a( C) }: Z; E% }. p8 l5 s$ o
代码展示
- A; v6 e$ \& Q. U h5 H
) M& p4 p+ r) |6 A, Dclass Solution {
P# e @- g Q+ k- }* g% [) t public int finalValueAfterOperations(String[] operations) {
: S4 z" E. G8 ~3 o0 d int v = 0; R% O# l5 I$ F# t% x
for (String op : operations) {6 T" d* K! i$ c
if (op.contains("++")) {
& q, H! Z5 u' s5 G; g! @2 o v++;
. K! J! q& Z+ h v& J } else {; S) N. s% @& n% S( p; K
v--;. l* ?; |! Z; B' |6 ^) D
}+ Q( P9 M. m/ h$ s, E- G4 w" ^
}
4 U0 [* J- s( v. W* O return v;
. [5 [7 `$ M- h4 G& ] }
9 Q- |2 v7 c4 y8 q}2 j s& Y) x) C2 z
5 j) @' ~+ o1 \6 Z【 NO.2 数组美丽值求和】, s! [5 B" Z% v7 T. Y. B/ D4 }/ L
# A& e3 M4 L4 [- @/ W6 f2 K7 s解题思路
9 S& _" W9 l7 C8 R& R/ L由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。* ?3 f" T4 H# D" t8 J. E2 V
( r" b- z( m4 w9 p& C+ ?2 k代码展示
) V5 u; V8 @0 b! K* I. T
- a T$ n- }( L0 D2 dclass Solution {
% g3 k! X* n) o" O) p9 A+ } public int sumOfBeauties(int[] nums) {
1 y/ ^/ P+ }" } y int[] preMax = new int[nums.length];
9 x' T# `# y8 H preMax[0] = nums[0];5 T' O" N% S( b E5 w
for (int i = 1; i < nums.length; i++) {* u/ l$ k7 S- d6 [ k) t/ R5 [+ { e [
preMax[i] = Math.max(preMax[i - 1], nums[i]);3 i/ ~ f4 _7 A
}* r7 W7 [# s7 \1 A
int[] sufMin = new int[nums.length];7 T: I, _- D; X; m. [; m9 e5 I
sufMin[nums.length - 1] = nums[nums.length - 1];$ H, o* d u8 a+ y
for (int i = nums.length - 2; i >= 0; i--) {
) C1 E) w/ a! C3 [ sufMin[i] = Math.min(sufMin[i + 1], nums[i]);
" C. Z7 i9 I: l# i }6 @$ N# ~' t' w! P: }
int res = 0;
6 l# [: b' o$ U# H for (int i = 1; i < nums.length - 1; ++i) {
" T/ z; R+ e) _0 o if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {: g% `5 M3 t' k# H: W
res += 2;
2 R" D& r' h- `$ O+ m2 `* f1 K$ g7 }8 m' K } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {/ F0 t- L& w4 K( z3 k& h% B* X3 n( U
res += 1;
& @! r7 U2 I @# L% G, n W& ] }5 O5 X# e/ N3 V& T( O l
}" u2 S; P7 P) o" E8 x! a
return res;. F2 Y( U+ W6 k! G: @7 L
}! X6 h t, x P! g4 k
}
( t! V0 ~1 A! ~; f8 l5 P- T) X$ a' E/ N0 Q- h
【 NO.3 检测正方形】5 j7 ^% f; I0 F- X' ]) M% |
' J4 u) X0 E4 s) R' j# G
解题思路, C* U+ d9 \8 ]' x( H3 V
使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。
+ `5 |7 L/ S9 {
! |4 ]% p Q$ c代码展示9 n+ R6 e! o; b' u0 M, _ o4 T
( T* t+ F% L4 o( D- d: x/ \% B
class DetectSquares {# K. T9 c* t8 V. Y
& P" ]) x" \7 w
Map<Integer, Integer> count;
8 j+ I, x& F2 O" l* x8 W" u
; V5 `9 W6 b* ^" X$ `! ~ o* n public DetectSquares() {
! P5 z% a* E& h( ~6 J count = new HashMap<>();
1 x; Y1 {6 ]& t- U3 ^ }
6 Q# y! s7 t- `
/ t; g! i# e9 p* l! y public void add(int[] point) {& p* \3 f: e7 I1 J
int c = comp(point[0], point[1]);8 b; P/ u- `: u5 l% V, F7 B5 y2 I
count.put(c, count.getOrDefault(c, 0) + 1);
* c4 r1 Q' e0 w& ^, g }$ ^4 ~1 D. }2 H6 x$ U
# B; o& D- T2 x/ V
public int count(int[] point) {
`9 f) S# Q4 r+ D% k int res = 0;. ~( s; M$ T# v1 o
for (var kv : count.entrySet()) {
% J& s9 T' K- C& w% H$ n- g int x = X(kv.getKey());
3 z8 h( F% x6 t int y = Y(kv.getKey());
H) r& w3 H" x0 X% x a: d if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {8 T& g( I& l$ ]
res += kv.getValue() *
. {8 m* @' x% g6 _& z* I count.getOrDefault(comp(x, point[1]), 0) *
, [% r# q0 Q+ m0 r8 A count.getOrDefault(comp(point[0], y), 0);+ [0 l. _" a% S3 C1 b
}
! d4 A' X y, ^+ T }
0 V# p* ?' F' T2 |/ U return res;
; J# L& _ g4 m) q6 ` }9 R/ v& k7 X: l6 z) [
# l3 ] A# G9 K3 M6 L3 b$ N" E private int comp(int x, int y) {
( u9 N7 _- R& U return x * 10000 + y;, E; z5 f( g8 H
}
* P# s. Y j% ?0 t' U6 w. C6 ]1 M) A f7 ~
private int X(int c) {
4 W6 J" Q8 k7 s/ z: @- o! B return c / 10000;" _' Q% z1 f$ p( r1 v6 U9 D4 Z
}' c+ ]; R& E" ?4 m! ~+ [+ x
6 `* m3 \- @2 g5 m$ C4 l2 R
private int Y(int c) {5 k0 ?/ Y6 A9 p# I
return c % 10000;
0 @ ^ O, I7 ]0 @; t9 @+ d }
, N; |, p& x% W/ }3 W}
8 \: Q% X; T# G% ?: U% S0 x% `, G( B4 x* }# C
【 NO.4 重复 K 次的最长子序列】
3 }" c1 |4 M/ o) B1 ]: N4 b% |+ }( u& W: k" M5 B
解题思路+ M' N @- {4 ~5 O. _( g0 J+ R/ x
注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。
" [$ `' W3 X+ ^. E1 g
/ Z! D; `1 y* }) o我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。5 i; F; B1 Z% C4 o9 X& P7 x
h4 H3 M* \* _代码展示1 `2 X+ y* r1 m
7 ]% m( x! @$ }( @) f! A& f
class Solution {
' \. `! }9 T2 y5 U& N8 O0 R public String longestSubsequenceRepeatedK(String s, int k) {) A2 x5 u2 M; K; U
Map<Character, Integer> count = new HashMap<>();
. R) G- d2 ^) E/ L% E1 N7 H for (char c : s.toCharArray()) {
0 @) }+ B; d! L; b2 S count.put(c, count.getOrDefault(c, 0) + 1);
. W6 P- T9 ?/ W2 U3 z* i }: ~5 E6 A0 J1 c% Z/ {
StringBuilder s2 = new StringBuilder();
* I& A1 E7 l5 | for (char c : s.toCharArray()) {
9 Z5 I( I) J+ t( Q. h if (count.get(c) >= k) {! j8 I7 b: E6 T1 W# B& X, U6 X
s2.append(c);
: z M, l8 @0 Y }' I t1 W2 p- x5 z3 D3 t# C
}+ R* D, \* j2 @! [1 _' h, q
count.clear();8 |3 o$ B% c, }, e" L
for (char c : s2.toString().toCharArray()) {
' J8 y( P O6 w( g: ?5 n2 K+ G count.put(c, count.getOrDefault(c, 0) + 1);
5 u4 B. _& R. Q0 b8 S" G+ X% s( z6 M( A2 t }
: C( e7 ~: q6 ?. j& N, } return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);
. Z$ h, L' h" r- O. b9 { }. {" g* c* z4 w4 x& |
+ ^: ~, Q2 a s6 j, G
private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {- w8 p0 K3 g7 T; Y& j
String res = "";
; F0 k( L2 C. _ var keys = new HashSet<Character>(count.keySet());: H% D/ W" a' D4 ]3 A8 u
for (var c : keys) {
8 j; K$ N: ~' d5 h% [ cur.append(c);) X$ q% `. H$ f. w9 A
if (comp(cur.toString(), res)) {7 I+ C7 M8 D, v+ H' Q" ?5 N
int cnt = 0, idx = 0; g7 v, o g# T1 C" b2 R' F5 A
for (char cc : s) {. q; J. _8 v% R3 U: S. F
if (cc == cur.charAt(idx) && ++idx == cur.length()) {
0 H7 }( l0 M/ B! R, A idx = 0;
/ C1 L9 {3 Z5 s* O. y if (++cnt == k) {* n* e) h1 O, m% n% E# O
res = cur.toString();
: \9 u8 l6 J- X- U2 G break;
' D& V" u/ M& @4 s" b5 H+ p }
5 N5 C0 ]* ~( e# F }* Q/ n$ c# C- H
}
, N; ^2 [- u: ^( F. R- }4 U, a- ` }
2 ~8 N' t* ^7 Z7 H$ R5 ` int bak = count.get(c);
& Y7 ], k. m+ X if (bak - k < k) {
$ ~1 k- E8 \) S! K1 D count.remove(c);
% g1 {- M( I* c } else {! f, |; E! ?" z4 M# c4 o; o6 n- a
count.put(c, bak - k);
9 W ^# ?' U/ P$ Q& ?/ P6 Y1 D }2 Q4 t% q5 W3 ?3 ~1 \
String r = solve(cur, count, s, k);
% W4 i4 H4 s, _ if (comp(r, res)) {* v/ t P* f& z; S
res = r;; X2 D2 _9 h0 z' q" c& H* w" i
}, ]5 p5 F6 U- O$ W
cur.deleteCharAt(cur.length() - 1);, c. J. F* r: F }/ e
count.put(c, bak);
- R z( B! W+ H4 W$ h' e9 n }2 V6 _& y; @& {( J; }9 F' V
return res;+ y' g1 [' T1 o
}
, v& x5 w, B! W" ^0 M
/ @( C1 Z) J5 \1 u private boolean comp(String a, String b) {, a2 A/ e, x: \* X- y" @$ r' F
return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);
, _- [4 O5 P, ~0 b; q& S8 f0 [6 b }( a1 L9 B, j4 _5 u+ _9 l# U
} |