登录后可回复主题
您需要 登录 才可以下载或查看,没有帐号?注册账号
x
【 NO.1 执行操作后的变量值】$ ^1 i9 W4 Z n) k G: g
解题思路' o% q3 j j9 U4 r, A; _
签到题。8 N/ d$ \% }$ P& N i) f* o# _
8 `3 `! b6 ]* \5 M# S: V( Q
代码展示7 H' P' g# R5 H* ~4 k
: R: N9 ?% X$ @
class Solution {) ^( D+ r( v) M+ y
public int finalValueAfterOperations(String[] operations) {
" N" t" ?' J" d0 Z9 T int v = 0;
, R5 B2 [$ g5 n! p/ h* H* p# @ for (String op : operations) {
; J1 ^, S3 C/ d8 v" ? if (op.contains("++")) {
5 v2 b" d; F$ B+ q7 |5 b- w/ C9 P v++;. [' G% b; Y0 T$ G6 H: h; p
} else {$ }& p: _5 H9 G. I. l5 d) n
v--;9 h0 ?- z" S- |8 a' l) a
}) U$ t$ f. U* Q9 x
}
: o g: r3 z* e" u% e return v;: h. F% `$ O n+ q7 e
}0 C5 B3 z4 i% g
}
" J% w2 K; ~# }" C: N, x
3 e! y8 G" z5 m% O3 c6 I【 NO.2 数组美丽值求和】3 u( H& e; O. C6 J% m, r4 A6 K
8 {- u' y% Y3 u" ~; k8 O解题思路: u( k7 N/ e7 S
由前缀最大值和后缀最小值即可得到中间元素的美丽值,所以预处理出前缀最大值和后缀最小值数组即可。/ h8 r! d0 Z/ e% l
% v/ ~ @* N3 N
代码展示
& d0 U$ L* N1 S" O9 b
( Z" h8 e6 I' E& }class Solution {) \; p+ P8 J4 p2 }# M
public int sumOfBeauties(int[] nums) {( b. D. L8 i! R6 [
int[] preMax = new int[nums.length];4 u9 {, Z& [% X8 C3 G
preMax[0] = nums[0];! ~, ~8 a3 h" M1 ^: L6 D
for (int i = 1; i < nums.length; i++) {
6 p% z& A; T0 x- V7 l& h; N preMax[i] = Math.max(preMax[i - 1], nums[i]);# t7 T1 O. C/ W9 ^1 P
}, @0 P) W& T; W( n$ h" }: O
int[] sufMin = new int[nums.length];
/ }" z& }- ]/ a d# z3 S2 L sufMin[nums.length - 1] = nums[nums.length - 1];" M8 W% e# G6 c9 ~
for (int i = nums.length - 2; i >= 0; i--) {% q& o0 b1 w/ Y, y0 x3 _; J% w Y
sufMin[i] = Math.min(sufMin[i + 1], nums[i]);
0 T7 s! V% J0 P! K0 G/ o( g }7 j, I6 V$ q% N
int res = 0;( n X1 V# D$ p- X% L
for (int i = 1; i < nums.length - 1; ++i) {- {0 M7 h9 ^, `1 T* \: T" Q
if (preMax[i - 1] < nums[i] && nums[i] < sufMin[i + 1]) {: O* f8 O! V6 z3 K" E, s% `& }8 N$ o
res += 2;
% P* \/ o$ }9 ]5 T5 n } else if (nums[i - 1] < nums[i] && nums[i] < nums[i + 1]) {
: I4 C# y* n& U5 O res += 1;! l# [# M# g8 H( C" s" q
}& A/ G' [; j& A( |, _6 w
}5 v( p4 i& m* J) d" e" | p" Q
return res;
1 X9 i! ]) m0 w8 W/ K6 { }
9 i( v# i3 |6 W+ J; P i6 S}- F$ V# o4 _4 s/ _, C
+ ?$ J V0 G2 O6 T【 NO.3 检测正方形】
- H; x4 O6 D& M1 Y$ m, u* z2 ^8 Q' i5 ]5 R) j
解题思路
( ]5 ]0 C! V9 q( u k& _) Z使用 Map 储存所有的顶点,然后在 count 查询时枚举对角线。
& v* L+ y: b; [. k {4 V) \8 m. r: z# p
代码展示
; s4 R+ _5 P7 D( u: Q0 c1 C; n! ^ b
class DetectSquares {# G3 ~$ |. `& K- S+ l' T3 T
- }1 }/ s2 X* c5 t
Map<Integer, Integer> count;
' @; S: n$ ^5 g& Q
" \6 R$ ?, @+ i) q7 S7 s public DetectSquares() {
. ~4 _* j# a' F5 _ count = new HashMap<>();- J' r" X8 L# Z% Z4 o$ a; N# U* \: C
}
( y$ ~6 Y3 i0 J
+ U) Y% j$ W0 C; k2 w public void add(int[] point) {
( E5 l* C B, T; q. U6 n6 t7 ~; l int c = comp(point[0], point[1]);
+ x$ a+ F( A" I* d2 Q' [2 }1 M count.put(c, count.getOrDefault(c, 0) + 1);. o. F G9 a8 R* O G! [ d" Z
}4 K, h$ ^( m& E. ?6 j
5 Z1 `! _. g) ~5 z! S
public int count(int[] point) {
: V, u- Q. \7 N( p9 q; M7 f2 x/ E int res = 0;
+ H# G" k; a& ~1 d, } for (var kv : count.entrySet()) {
* s! m6 y+ g! e1 p: ~ Y int x = X(kv.getKey());; L- a2 U& a; g( _# ?5 d9 W: f
int y = Y(kv.getKey());
2 y1 Z$ ^: l( l' ?3 { if (Math.abs(x - point[0]) == Math.abs(y - point[1]) && x != point[0]) {
1 M p0 {- x8 v res += kv.getValue() *! R9 u. c- M( b6 M4 T3 f! D Z
count.getOrDefault(comp(x, point[1]), 0) *
$ ^6 L% _6 a- B3 _6 c% y count.getOrDefault(comp(point[0], y), 0);: D- {5 y3 f% G& M: r- k
}% g1 y/ T" {. u- q. m
}4 x" G! t0 T( f: c; B% b
return res;
* Q$ s# s" ]% K4 o3 E }) B# W B: R% i; c
' M: N: D1 P- y" x3 X1 P: K private int comp(int x, int y) {
- M. G: {0 y- n- L return x * 10000 + y;$ V& S) b* {8 a' w
}
. u( Y- n, }7 o/ z# C; T# Q. d. B
d' H+ j5 X5 B4 e" v private int X(int c) {
; X# A: G$ X& Y2 c! E return c / 10000;
$ u% {4 j, t' f* h+ G+ h6 ] }% a: H8 B) t8 w5 j
' ~% y8 q; k# V, ^3 Z% F; o; Q" ] private int Y(int c) {( R; }+ g% b* S x$ J* H
return c % 10000;/ Z8 T8 n+ f: _0 T
}
3 A; ]% g1 L% ? c( U8 k}
3 P% Z E* Z1 D; h" j0 V+ r, u( Y0 R* t+ Z; Y" d# j
【 NO.4 重复 K 次的最长子序列】
# C) j! J" b$ n. @) S) {
( H' C3 i, Y! t6 ?: C: w- y/ A解题思路* j" `) H3 Z e8 N+ K
注意 2 <= n < k * 8,而如果一个子序列想要重复出现 k 次,那么这个子序列中的每个字符都至少要出现 k 次,所以说答案的长度一定小于等于 7。
6 _7 _8 B; ~6 R- f
8 H- a. `1 b7 C' P4 g8 }我们首先找出来所有出现次数不小于 k 次的字符,然后枚举这些字符的排列组合,依次判断每一个排列组合是否出现了 k 次。
4 f L, x4 x" j+ r5 T I8 m0 A% m8 r$ ~2 a
代码展示1 {9 I; _+ L( m0 w% @$ u
2 B O- \5 M! V
class Solution {1 a+ G' }$ t4 f" C
public String longestSubsequenceRepeatedK(String s, int k) {
7 l" j, Y1 }; W Map<Character, Integer> count = new HashMap<>();
$ ^' U% ?3 }2 A for (char c : s.toCharArray()) {: F ^* F& H8 s% G5 x0 S& }! _& U6 h
count.put(c, count.getOrDefault(c, 0) + 1);
5 q! R$ [6 t$ y) Y$ ` }
5 }7 c: z+ @+ ~3 Z* M( N StringBuilder s2 = new StringBuilder();6 |! \8 g' F( ^- ?" }
for (char c : s.toCharArray()) {
; P3 M) r8 p3 a" D$ g% S* x if (count.get(c) >= k) {9 ?: G, I! |/ ?5 e- r6 m
s2.append(c);
# ?: w" X$ v* } }
* S, t) J- e: t' g }
$ t. f" O, Q9 q7 [# l$ O! u count.clear();, z' m1 \ |- M2 \8 e- u1 m
for (char c : s2.toString().toCharArray()) {: u, s& _' F9 j$ r% k/ R1 ]
count.put(c, count.getOrDefault(c, 0) + 1);7 ^0 R h5 z5 y2 V4 ^$ n5 j
}" j, H: _4 w' ?
return solve(new StringBuilder(), count, s2.toString().toCharArray(), k);
: S0 w: h+ j( C/ Z R. D' ] }, v" n8 T4 v! o% g- q6 l) B
' B p* J! K: c. Z" |# g1 y
private String solve(StringBuilder cur, Map<Character, Integer> count, char[] s, int k) {
3 @7 z7 `7 O3 U8 P String res = "";
0 d+ l, e9 s: f; p" o5 M4 w var keys = new HashSet<Character>(count.keySet());
% @) {# F# k$ _ for (var c : keys) {6 ~. N7 G+ J/ H. N3 @' ?) u5 @
cur.append(c);: e/ D3 P/ h7 r2 z; s
if (comp(cur.toString(), res)) {
* u* l0 I2 e4 h y3 k; V int cnt = 0, idx = 0;% a* }/ [. H ?5 q
for (char cc : s) {( ?5 k1 n/ C: ?. x6 r# C4 V
if (cc == cur.charAt(idx) && ++idx == cur.length()) {- o( J( p, r8 n6 k; V) w
idx = 0;
7 b) b) |; K; i7 _! d9 V5 n if (++cnt == k) {
) z: K6 J, _1 ?4 D res = cur.toString();
: H' o( Q" `& N! x break;
/ f$ h4 e0 Y1 {( k0 z8 _ }
6 B) H6 U3 ~" l }
; s% W L* c" h" _) V' c; P6 Q. E } T U2 W _7 Q
}! B9 v9 n% \# B7 o) p
int bak = count.get(c);6 F( E( Q/ K8 @: L
if (bak - k < k) {
! k! I+ C0 _+ q* i- K% } count.remove(c);
* \- A4 q2 q- v& {$ a. @ } else {" ?) x& V/ B* J& [4 B w
count.put(c, bak - k);
" U* ]5 N% P7 x: F% B }9 c7 o+ U0 D5 L
String r = solve(cur, count, s, k);
4 p" s: }: }; x" b' H4 z if (comp(r, res)) {2 I7 S' i4 a; p
res = r;
/ w# a6 S5 z2 x& @. q }+ x! s1 z, \/ \4 b+ s: [5 L
cur.deleteCharAt(cur.length() - 1);1 W% @" z3 d7 M: z
count.put(c, bak);9 u0 |2 F4 j% e, s/ R8 E
}
: D8 ^8 h4 ]7 K2 D return res;
& w1 M! V# o" z- _3 c }
4 ]. E+ O6 {8 T
* O4 ?* a7 @9 V! x$ G" j private boolean comp(String a, String b) {) F3 H1 i; h6 u- ]: q$ k( n8 j
return a.length() > b.length() || (a.length() == b.length() && a.compareTo(b) > 0);# f+ M7 L8 F) n: Z8 f
}
+ |* o& z% Y! F4 }7 t( e$ p4 F} |