个位数字为 K 的整数之和
难度:
标签:
题目描述
代码结果
运行时间: 24 ms, 内存: 15.9 MB
/*
* 思路:
* 1. 使用Java Stream API来处理数据。
* 2. 由于本题需要处理的是整数和逻辑,我们将重点放在用Stream的方式处理这些整数。
*/
import java.util.stream.IntStream;
public int minSizeSetStream(int num, int k) {
if (num == 0) return 0;
final int finalNum = num;
long count = IntStream.iterate(k, i -> i + 10)
.takeWhile(i -> i <= finalNum)
.map(i -> finalNum - i)
.filter(remainder -> remainder % k == 0)
.count();
return count > 0 ? (int) count : -1;
}
解释
方法:
此题目要求找到一个整数多重集的最小大小,其中每个整数的个位都是 k,且它们的和为 num。首先,如果 num 为 0,则结果直接为 0,因为空集的和为 0。如果 num 的个位就是 k,那么一个整数即可满足条件,返回 1。接下来,对于一般情况,算法尝试通过添加形如 10n + k 的整数来组合出 num。通过迭代 i 从 1 到 10,并计算 c = num - k*i,若 c 是正数且 c 的个位也是 k,那么总共需要 i+1 个数字(i 个 k 和一个 c)。如果在迭代过程中无法找到满足条件的组合,返回 -1。
时间复杂度:
O(1)
空间复杂度:
O(1)
代码细节讲解
🦆
为何算法在计算 `c = num - k * i` 时选择的迭代范围是 1 到 10?这个范围内有何特殊意义?
▷🦆
当 `c` 计算出来是负数时,为什么算法直接忽略这种情况,不考虑其他可能性?
▷🦆
算法在检查 `c > 0 and c % 10 == k` 条件时,为什么不包括 `c == 0` 的情况?这是否意味着某些解被遗漏了?
▷🦆
在迭代过程中,如果 `num` 非常大,但 `k` 较小,这种方法是否依然有效,或者会存在性能问题?
▷