题目链接:力扣
思路:简单构造题。sumN = n数组的和,sumM = m数组的和。这个题就是构造sumN = (n+m)*mean-sumM 这个数。通过n个数的和构造词出sumN这个数,限制条件就是这n个数的取值范围[1,6]。这不就很简单了。首先考虑不可能的情况。
考虑两个极限值:
1. sumN > n * 6 说明n个数全是最大值6也不行
2. sumN < n 说明n个数全是最小值1也不行
除了这两种情况都是可行的情况。
可行的情况怎么构造呢?我这里考虑通过6和1来构造,可以想到只有一个数可能不是6和1(看代码会懂的)。从一个6开始构造,直到不能放6了,最后剩下的都放1(除了那个可能不是6的数)。详情看代码。
上代码:
class Solution {
fun missingRolls(rolls: IntArray, mean: Int, n: Int): IntArray {
val m = rolls.size
val sum = (n + m) * mean
var sumM = 0
for (roll in rolls) {
sumM += roll
}
val sumN = sum - sumM
if (sumN > n * 6 || sumN < n) {
return IntArray(0)
}
val result = IntArray(n) { 1 }
for (i in 0 until n) {
var sumTmp = n - i - 1 + 6 * (i + 1)
if (sumTmp < sumN) {
result[i] = 6
} else if (sumTmp == sumN) {
result[i] = 6
break
} else {
var x = 6
while (sumTmp > sumN) {
sumTmp--
x--
}
result[i] = x
break
}
}
return result
}
}