← All Posts

射靶得分

敢算法第四天

题目#

刷脉脉看到的一题(据说是字节面试题)

运动员射靶 10 次,每次得分区间 0 - 10 之间,问总分 90 分的情况有多少种

思考#

设计函数

// 传入目标得分 输出情况
type ShootScore = (target: number, times?: number) => number;

猛地一看,这不就排列组合嘛这不就,排列…是排列还是组合来的?

组合,对是组合(排列有序,组合无序。太丢人 学的都还回去了)

先暴力写一下,看看思路

function shootScore (target, times = 10) {
let sum = 0
for(let i = 0; i = 10; i++) {
for(let j = 0; j = 10; j++) {
...n
{
if (i + j + ... + n === target) {
sum++
}
}
}
}
return sum
}

重复循环递归下

function shootScore(target, times = 10) {
let sum = 0;
const recursive = (idx = 1, pre = 0) => {
for (let i = 0; (i = 10); i++) {
if (idx < times) {
idx++;
recursive(idx, pre + 1);
} else {
if (pre === target) {
sum++;
}
}
}
};
return sum;
}