本帖最后由 上岸算法 于 2022-5-5 00:11 编辑
& z7 N# B4 M2 d4 m- @
- T+ Q' K( t* D2 e% l【 NO.1 移除指定数字得到的最大结果】& m" u0 Q7 b o6 O
解题思路0 _' I0 q# r7 b& B/ W7 `" A* X5 z
: S2 `6 L3 \1 ~& j+ q8 O可以使用 BigInteger 来比较大小。2 @3 k0 n* r6 v2 z5 I# W5 e$ o+ I
5 |* |1 G* ~4 b# n' e代码展示
" f) w; ~, W: m. Q/ b. {8 R7 `: l$ N, ^* Z% b
+ _+ P. N$ k3 G% w2 x7 D5 w; C1 K% E
【 NO.2 必须拿起的最小连续卡牌数】3 l) K; @: o- L) i# O7 T+ ?8 X: E
0 ~6 t9 `) o+ Q2 u* n9 U/ M解题思路& t6 @1 l+ n0 l2 E3 \7 m! O
4 }. }8 s1 [* b8 }( m; u题意即求相距最近的两个等值元素的距离,遍历一次,记录每个值上一次出现的位置即可。
8 Q0 |1 k- u7 S4 W; e% p6 U" x7 D0 C; e
代码展示# m2 k. i2 q# g
\2 v+ U0 s: X( w* B
$ t# N0 Z1 E6 L8 s
, p5 G+ U- S, @ [. y【 NO.3 含最多 K 个可整除元素的子数组】/ y1 |3 i) N5 C4 P! B' G
3 o; D, I/ q! O
解题思路
, Q! F6 s4 ?$ S; q$ h, p v
" u. i( u; c! A! v& y# P; o; }, I定义一个 SubSeq 类,实现如下几个方法即可用 HashSet 统计数量。
+ m0 n9 |6 K6 J+ i. A0 V
5 I+ f7 J/ W- jhashCode 计算哈希值6 i- l0 [" h; N
check 检查是否满足最多有 k 个能被 p 整除的元素- E$ X/ `5 V) h5 l6 t
equals 检查是否相等* ~( e; j/ a* C5 b% c
6 f# D7 c1 R( ~9 U
代码展示
- d6 R) r7 C- G3 ?" y+ Y
$ X4 R, ?. @6 u# A$ R
' e- {0 I9 @; x& l3 o8 ^
$ x" l8 f' _/ j; W- T【 NO.4 字符串的总引力】
/ ~8 Z }! Q" Y& i) R! x# Z
' Y$ Z( x$ f# j8 T1 T解题思路% o4 N5 A& B9 T! d1 @6 @
6 j7 [* F: I- M0 K3 R) n8 g0 ]定义 f 表示以第 i 个字符结尾的子串的引力总和,再定义 pos 表示字符 i 上一次出现的位置。6 D. z1 L$ W9 m$ y) L
4 {. ^+ I g7 h0 u% S. q则有 f = f[i - 1] + (i - 1 - pos[charAt[i - 1]])
) O6 \9 O5 B D/ Q# U z9 \7 T. J4 F' R
$ d5 i/ A, D9 G2 c1 j7 L因为以 i 结尾的子串中,pos[charAt[i - 1]] + 1 到 i 之间的子串都会多出一个字符 charAt[i - 1],而其他的子串的总引力与以 i - 1 结尾的子串的总引力相等。2 g5 g, p8 }9 Z+ F! Q- H' U
2 s$ z* [; C: `/ m. w6 k代码展示
& T" s* v9 u8 t- @5 X; \' [! v- x) ^, g6 s+ l% ^6 j" F# D
4 P. u* r( A! l7 N5 p! u |