算法-射靶得分

elegantYU 发布于

敢算法第四天

题目

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

运动员射靶 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
}