本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述
森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。
返回森林中兔子的最少数量。
示例:
输入: answers = [1, 1, 2]
输出: 5
解释:
两只回答了 "1" 的兔子可能有相同的颜色,设为红色。
之后回答了 "2" 的兔子不会是红色,否则他们的回答会相互矛盾。
设回答了 "2" 的兔子为蓝色。
此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
因此森林中兔子的最少数量是 5: 3 只回答的和 2 只没有回答的。
输入: answers = [10, 10, 10]
输出: 11
输入: answers = []
输出: 0
说明:
answers 的长度最大为1000。
answers[i] 是在 [0, 999] 范围内的整数。
二、思路分析
- 求的是最少数量,所以答案中相同的回答优先按是同种颜色考虑,如有 2(m)只回答 2(n),则相同颜色最少是 3(n + 1) 只。所以先要对数据中的答案进行统计汇总。
- 统计汇总后计数可能大于答案,如有 3(m)只回答 2(n),最少就还是是 3(n + 1)只;如有 4(m)只回答 2(n),多出的 1 只还有 2 只与它颜色一致,则最少有 6 只。
- 总结规律得出计算公式
回答 2
计数 1 2 3 4 5 6 7
最少 3 3 3 6 6 6 9
总数等于 n + 1 的倍数,倍数是 m / (n + 1) 的向上取整。
num = Math.ceil(m / (n + 1)) * (n + 1)
- 特殊情况,回答 0 ,没有一样颜色的兔子,则计数多少就是多少兔子。没有答案的空数组,则没有兔子。
三、参考代码
/**
* @param {number[]} answers
* @return {number}
*/
var numRabbits = function(answers) {
if(answers == []) return 0;
let type = [];
let same = {};
answers.forEach((item,index) => {
if(same[item]) {
same[item] ++;
} else {
same[item] = 1;
type.push(item);
}
});
let all = 0;
type.forEach((item,index) => {
if(item == 0) {
all += same[item];
} else {
all += (Math.ceil(same[item] / (item + 1)) * (item + 1));
}
});
return all;
};
执行结果
执行结果:通过
执行用时:84 ms, 在所有 JavaScript 提交中击败了83.67%的用户
内存消耗:39.1 MB, 在所有 JavaScript 提交中击败了77.55%的用户
四、总结
此题目结果比较有规律可循,根据结果找规律可总结出计算公式,再对公式进行验证,找到一些边界情况即可通过。