上岸算法LeetCode Weekly Contest 291解题报告

【 NO.1 移除指定数字得到的最大结果】

解题思路

可以使用 BigInteger 来比较大小。

代码展示

【 NO.2 必须拿起的最小连续卡牌数】

解题思路

题意即求相距最近的两个等值元素的距离,遍历一次,记录每个值上一次出现的位置即可。

代码展示

【 NO.3 含最多 K 个可整除元素的子数组】

解题思路

定义一个 SubSeq 类,实现如下几个方法即可用 HashSet 统计数量。

  • hashCode 计算哈希值
  • check 检查是否满足最多有 k 个能被 p 整除的元素
  • equals 检查是否相等

代码展示

【 NO.4 字符串的总引力】

解题思路

定义 f[i] 表示以第 i 个字符结尾的子串的引力总和,再定义 pos[i] 表示字符 i 上一次出现的位置。

则有 f[i] = f[i - 1] + (i - 1 - pos[charAt[i - 1]])

因为以 i 结尾的子串中,pos[charAt[i - 1]] + 1i 之间的子串都会多出一个字符 charAt[i - 1],而其他的子串的总引力与以 i - 1 结尾的子串的总引力相等。

代码展示