本帖最后由 上岸算法 于 2022-5-5 00:11 编辑 1 l, U# q% x& q d
a' ?) C( s* ^1 g$ |【 NO.1 移除指定数字得到的最大结果】
1 k0 b7 c( P) k8 h$ p) i解题思路; y' R( b) @# \- h
. R9 N3 G% n* ~' b" V- j
可以使用 BigInteger 来比较大小。; e5 E7 g/ L2 b, ^+ |% O3 C
( @0 S- g( \! |+ ~- S, ^- _
代码展示
P1 M, U q& H# B; @" I. S
: r2 e4 v( K. a; R1 q! b: D' \+ ^1 c& e: s* o4 x# h% f9 T
$ Q) k# k; }' f3 b
【 NO.2 必须拿起的最小连续卡牌数】3 b3 R* g' z$ T- \
3 m5 Y- x# e2 k! {( b' G. J- ~
解题思路
! s# C& K0 _# b2 j1 [5 r* k1 Y2 X/ J+ v, N2 z/ j
题意即求相距最近的两个等值元素的距离,遍历一次,记录每个值上一次出现的位置即可。
9 b& b" d) c9 g+ J/ N9 F5 R: w$ w5 {6 F& V
代码展示3 P% h/ T) |6 ?, r
7 q5 v! f2 S- B- P- n3 Y5 M
- c2 ^/ @( { L6 `" w# o4 z, K2 T! D3 t7 N, c8 S! [5 w5 k
【 NO.3 含最多 K 个可整除元素的子数组】0 J. ^! I& ?! B8 Z1 [
: q. J* s: E6 y7 s& B解题思路
0 m0 z; o0 ?4 E! n
" d- N2 v. ?. `( y定义一个 SubSeq 类,实现如下几个方法即可用 HashSet 统计数量。2 @; v% n) ?0 b* k, t
& b4 a7 F+ h3 E" f+ T6 m6 A' XhashCode 计算哈希值' ~$ G# n0 p" `" I! P* C
check 检查是否满足最多有 k 个能被 p 整除的元素% d! s O' P+ j7 ~9 C- C
equals 检查是否相等
( C" J& |9 W5 u* p4 k4 o
+ }# |+ R5 H3 y: [; R9 f5 {代码展示
% i* L, g" U1 p( R- D. [; k) M. K# Q. }2 c1 T
3 G8 D R U9 A! D" M- @: c0 F
% ?9 l( a' {! m9 o【 NO.4 字符串的总引力】$ W- f6 N& q) Q8 \. i- s
" w" B% p4 z* b. x解题思路8 w# R2 h* f9 R" |. H f! E
) ]" H Y4 Y+ ?, b, e& {0 Z( q( z
定义 f 表示以第 i 个字符结尾的子串的引力总和,再定义 pos 表示字符 i 上一次出现的位置。
7 D7 U& e: `4 p) b }3 j
/ F6 V( T7 L8 ?则有 f = f[i - 1] + (i - 1 - pos[charAt[i - 1]])* P- g6 i' U! c' E8 v
& c% T* j' z% x3 U Q因为以 i 结尾的子串中,pos[charAt[i - 1]] + 1 到 i 之间的子串都会多出一个字符 charAt[i - 1],而其他的子串的总引力与以 i - 1 结尾的子串的总引力相等。
; }! ?- }: M% J/ d% Y) P Z1 @$ \+ Z
代码展示2 V' y+ U, l. d8 y
8 x) v" l l7 a
6 |. ^8 c6 A+ p; a6 x+ q
|