14 数组元素之和最小化
问题理解
- 两两不同:数组中的所有元素必须是唯一的。
- 最大公约数 K:数组中的所有元素必须是
k的倍数。 - 元素之和尽可能小:我们需要找到
n个最小的k的倍数,使得它们的和最小。
解题思路
- 生成数组:从
k开始,逐个生成k的倍数,直到生成n个不同的数。 - 计算和:将这些数相加,得到数组元素之和。
核心代码
24 小R的随机播放顺序
问题理解
播放规则:
- 播放歌单中的第一首歌,并将其从歌单中移除。
- 如果歌单中还有歌曲,则将当前第一首歌移到最后一首。
- 重复上述步骤,直到歌单中没有任何歌曲。
我们可以使用一个队列(Queue)来模拟歌单的操作。队列的特点是先进先出(FIFO),非常适合用来处理这种需要按顺序移除和移动元素的问题。
解题思路
- 初始化队列:将输入的歌单数组转换为队列。
- 模拟播放过程:
-
- 使用一个列表来存储最终的播放顺序。
- 循环处理队列中的歌曲,直到队列为空。
- 每次从队列头部取出歌曲并添加到播放顺序列表中。
- 如果队列不为空,将队列头部的歌曲移到队列尾部。
- 返回结果:将播放顺序列表转换为数组并返回。
核心代码
31 不同整数的计数问题
问题理解
题目的要求:
- 替换非数字字符:我们需要遍历字符串,将所有非数字字符替换为空格。
- 提取整数:在替换后的字符串中,提取出所有的整数。
- 去重并统计不同整数的数量:使用集合来存储不同的整数,并统计集合的大小。
解题思路
- 替换非数字字符:使用
StringBuilder来构建新的字符串,遍历输入字符串,如果是数字则添加到StringBuilder中,否则添加空格。 - 提取整数:
-
- 使用
split("\s+")将字符串按空格分割成多个部分。 - 遍历这些部分,去除前导零(使用
replaceFirst("^0+(?!$)", "")),并将结果添加到Set中。
- 使用
- 去重并统计不同整数的数量:使用
Set来存储不同的整数,最后返回Set的大小。