登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 执行操作后的变量值】
, | S+ C. Z; G( R解题思路: `" |7 H% C' Q% S% K% h
签到题。, D, ]0 ]2 n( L" E
1 P" G3 U1 B6 u0 V6 |, G
代码展示
$ r! B# \; n+ v, F6 j3 K7 w. h5 @! @4 k
class Solution {2 K# y9 }* R) W4 {
public int finalValueAfterOperations(String[] operations) {: Y2 @6 d V& r E* C& Q1 N
int v = 0;, N, M8 v' c z8 A4 y# M. v) p
for (String op : operations) {
! y+ H# V3 N1 b/ p5 {* b. K if (op.contains("++")) {5 o6 P; J- `: @5 q% L# X
v++;
6 |* s6 ^( X3 Q/ _ } else {
' @( t6 n( l" N6 x v--;! o% W$ p8 }9 _; U
}9 p# V$ L+ A- r) k
}4 N9 {; _! v' a9 L$ C- h% Z" h
return v;
5 h% X5 P" }1 C$ z# h6 ~ }
7 |- O8 q: S8 D}" _4 v X. Q: A0 h8 `# e
1 r5 S3 u" A& L# \+ |3 D
【 NO.2 数组美丽值求和】
/ J3 D1 O8 |" g! P
9 j& g8 V u1 A0 l: D! s解题思路
- ^: S' r2 j* e2 K$ ~* y" l' {由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。
0 ^ A. M+ _9 S" Z5 a% W E3 S n6 n, b7 H, ^
代码展示
+ B1 a9 y! W8 s" r Z) i
! t- j, x; d8 ]" _) m% eclass Solution {
* Z( c2 L4 V: h- q: I k, \4 O public int sumOfBeauties(int[] nums) {
: ~$ N9 E+ f0 |5 l% b int[] preMax = new int[nums.length];1 ?. a0 u+ Z4 s& s8 k C
preMax[0] = nums[0];# t2 q# {) R6 S, _6 E X
for (int i = 1; i < nums.length; i++) {
- f5 s: e7 R' O* G& Q$ I preMax[i] = Math.max(preMax[i - 1], nums[i]);
7 \3 R' ~; ^( e! _+ r+ j }3 v7 S, _: I; @# k/ L
int[] sufMin = new int[nums.length];
% z$ H' u, N/ q) Z& P6 R1 N sufMin[nums.length - 1] = nums[nums.length - 1];/ T5 A' F/ o9 g7 i8 Q3 U0 _
for (int i = nums.length - 2; i >= 0; i--) {- l/ k# a0 S; [: [+ Z1 C
sufMin[i] = Math.min(sufMin[i + 1], nums[i]);2 p4 f. I8 O+ t, {
}
- x( d* ^/ v6 J3 T/ B6 ]9 m* Z int res = 0;
9 C$ f7 t" t& \+ M8 ~9 l for (int i = 1; i < nums.length - 1; ++i) {* U) {- s$ O l a& C9 {8 Y1 j0 z: E
if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {
9 c- \! h* F* z res += 2;
. \4 Q! C: o5 F- Y7 ~" ?( c } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
: l8 V- v! e9 o: _ res += 1;' w ` P( ]4 k. W7 w
}
- Y' Z4 D* Z" j) ^; U/ z }
7 y4 C' m$ U+ i) z% t: p, G return res;! C$ j k: I6 \! d! O* A, a! Y1 A
}
$ s) q. a/ r0 u}: e* ~+ a& w: M# m% y
; b6 `+ U9 V# p! {
【 NO.3 检测正方形】
7 u* U2 B- @8 [/ q/ J9 {# {1 [. H0 _* w2 |1 |! v8 h" I
解题思路( l9 Q! o$ b B- w1 x, [$ Q+ H
使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。
3 A: T, \4 G6 i( y4 v4 e5 L
4 u: r. k" p( U. H% J: X代码展示+ k" V% w. Y* P7 w( \( T a
+ T5 ?$ L! L1 U7 n) f6 r) ^class DetectSquares {9 |3 M) G0 q+ O1 b* Z( Y* z0 o
1 x# l1 Y! p5 a6 P0 J8 {1 [ Map<Integer, Integer> count;
( c6 i( W7 E/ e2 V& D+ q, q0 b& }; R! q" f1 d
public DetectSquares() {; j1 p" C+ ]- V" l S( U& I) z
count = new HashMap<>();& d" u% t6 @: M3 h: H. ?( U
}" F0 p" _- \ T- `0 I
3 J% @% r7 ^* z' y& T
public void add(int[] point) {
) R& {6 v0 d: H/ ?! N! s int c = comp(point[0], point[1]);1 o! n9 C! W2 R# p6 c- V; ^: }
count.put(c, count.getOrDefault(c, 0) + 1);
- g. _8 J P: W }
% a7 q% ?+ W* N6 w4 B# e1 ]* N0 W0 c5 A
public int count(int[] point) {8 [# ]9 C ]3 q* A
int res = 0;
/ U+ h" q6 G% B! i3 E6 l for (var kv : count.entrySet()) {
3 L( r0 H: ^; \; n int x = X(kv.getKey());
6 J8 v+ c9 @, E7 o9 J6 z2 n( } int y = Y(kv.getKey());: U# X% d) h+ E6 ^( d( T
if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {/ H2 m d( a9 h
res += kv.getValue() *; R* q6 ^( C, N5 s% W0 `9 X- T
count.getOrDefault(comp(x, point[1]), 0) *0 @" @3 W& Q; v7 x. g
count.getOrDefault(comp(point[0], y), 0);9 \ P4 a+ O) b* G/ Q- z
}" \5 O: `: A |, ]/ f9 n
}1 \4 m5 k0 Z7 u% Q0 Y7 c
return res;
8 t" R6 q6 [2 |1 @: B; y }/ U/ Q* H& T8 ?( Z
' A* n: k/ L# o7 ^ private int comp(int x, int y) {- m: _/ y# e8 b- ~& G7 T" y" N; C
return x * 10000 + y;- H5 r: R6 r/ a: }: \
}: Q% ?5 ]) b& q, J
9 `1 |* s8 \, T( R7 m9 b: Q' e private int X(int c) {
' U& l# U+ H0 x. i! g return c / 10000;" e- g5 a9 T6 d4 \! Q/ _' q
}% g4 s. x6 L0 ?
, D$ C r0 L6 o* b: g
private int Y(int c) {
6 G3 {# m. ?% h: N return c % 10000;
1 r5 E& C( D- |6 i0 e8 Q }* R) H& W1 _" ?) w& n5 i7 i" B
}
$ }; \9 {; M; f
4 y8 i* ]& k9 x! p4 S【 NO.4 重复 K 次的最长子序列】8 R; T3 s9 w( z( c; }
: ~8 n" ?- ^ A) x0 A) X解题思路0 P- W- m6 q9 a) x) a3 }& |
注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。1 ^- T) y/ v5 g$ B# G* `" h
6 Z3 ]: U$ E- I' a9 @( d
我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。0 E) s) ~1 m3 P8 o( ~
7 O* q4 d8 S& M q
代码展示
+ U: d' A6 g; W1 i* }6 ~7 J& V+ N9 U* g, \% U3 a
class Solution {
5 w5 b0 W4 |/ Y; u2 D- f9 R' v public String longestSubsequenceRepeatedK(String s, int k) {
8 x3 Y9 w y. q Map<Character, Integer> count = new HashMap<>();& X4 O- K# U. q. M2 J. R; `' E# D
for (char c : s.toCharArray()) {' }. S$ }4 Z, x/ w0 _, b" H' b; M
count.put(c, count.getOrDefault(c, 0) + 1);
X' s3 n8 A$ g7 K9 _ h }5 S% q6 Z- [9 s3 U7 J- ^% d
StringBuilder s2 = new StringBuilder();7 V5 Y+ u& w; j6 q7 T
for (char c : s.toCharArray()) {& ~: B9 C. R% ^+ ~+ X& Y# y. a
if (count.get(c) >= k) {2 n3 m" `/ H E3 f! u A
s2.append(c);
$ T' |1 o& F" H! J% g/ Q4 F* K4 f" `3 L }
8 f; M6 V7 } O/ @$ w4 E8 M- } }( E! q8 o( F! [' G) _+ H8 E% Z
count.clear();) v: v& ~- A6 c# a, ^0 \3 }
for (char c : s2.toString().toCharArray()) {* f3 e1 w9 w3 J5 @6 V
count.put(c, count.getOrDefault(c, 0) + 1);9 n6 b! C; A; D y- l6 K) z
}
+ g! g3 y V) S. d+ l! L$ F return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);6 y5 G2 r% x: n/ j3 u
}9 r5 K0 W8 k6 i u8 T" X* _
{. g! _# y: A" z$ a private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {
$ v M( D+ ]0 W" V String res = "";
; L% }& @' S: R& C$ I+ L+ H9 `+ W var keys = new HashSet<Character>(count.keySet());) d. B/ T9 f* T: D3 N0 a1 H
for (var c : keys) {
' Z8 D2 j& Q# J cur.append(c);# F9 }( P" B8 S% O+ e
if (comp(cur.toString(), res)) {
( F" r5 ^2 N( X9 c* b" v int cnt = 0, idx = 0;
. `0 [ M% N1 ?9 T for (char cc : s) {4 o1 R1 B( Y4 P3 b. L8 X" K$ s* C( B
if (cc == cur.charAt(idx) && ++idx == cur.length()) {
) B& `+ p5 A; ?0 J; i* p8 Y idx = 0;6 R8 \# V3 T H, H7 w& V
if (++cnt == k) {1 M1 |& z( C* ~! u0 `
res = cur.toString();* g' [) X K( B
break;, V. U M9 t* n
}# k* O/ Z+ p [" G; F5 Z9 E
}
0 y1 V; m$ Z% Z9 ~7 b8 |6 T; E }
- P1 n# [3 [2 J6 u5 I: {/ V( k }8 f0 \: J ~2 _5 l4 G% i0 w* \
int bak = count.get(c);
0 e1 J: Q# o$ f+ t! c( ^ if (bak - k < k) {
6 P! ^% f6 i/ k; w/ R count.remove(c);
& d+ U1 T/ @% z4 [4 C } else {( Y! a! \& ~$ q$ \: v$ I l
count.put(c, bak - k);% K6 t6 T1 _% w3 K" [" I7 @+ u
}
; @7 h7 d+ O5 W' b* v- |" E String r = solve(cur, count, s, k);
7 h4 w1 H; B; U2 k# R3 B t0 d- c' j( L if (comp(r, res)) {- f, l, k) a# ]0 d D- `! u. W
res = r;5 A" h8 C1 ~- v; ~
}
0 t7 h! E$ y) R/ e# ~! [ cur.deleteCharAt(cur.length() - 1);0 H" m* s+ G0 M( m5 M8 I/ ]: C' k
count.put(c, bak);0 G3 v! @" x8 g5 p" C, |% L
}
+ _# G' M4 W$ b S- q1 @1 K2 @ return res;7 i' G& o: M! d! t+ @6 W
}/ n; u9 `4 W; a8 Y5 X' P
1 {# O* [8 |5 h- T& Y private boolean comp(String a, String b) {" u1 E/ L% R7 e5 n
return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);. j- n+ _6 f1 A" P$ f3 O
}
1 g9 W. V8 r0 _; O# E} |