华为OD机试真题 JavaScript 实现【分糖果】【2022Q2 200分】,附详细解题思路

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、JavaScript算法源码
    • 六、效果展示

专栏导读

本专栏收录于《华为OD机试(JavaScript)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

  • 专栏福利:限时订阅49.9,订阅后可加入华为OD刷题群,获得哪吒优先答疑机会(华为OD刷题指导,远程代码调试),群里大佬众多可以抱团取暖,群友刷题经验分享,考试经验分享。

在这里插入图片描述

一、题目描述

小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。

当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。

小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。

二、输入描述

抓取的糖果数(<10000000000):

27

三、输出描述

最少分至一颗糖果的次数:

7

啥意思呢?

  1. 27+1=28
  2. 28/2=14
  3. 14/2=7
  4. 7+1=8
  5. 8/2=4
  6. 4/2=2
  7. 2/2=1

懂了?

四、解题思路

  1. 读取输入的糖果数量 sum;
  2. 调用递归函数 count(sum, 0),传入糖果数量和初始操作次数 0;
  3. 在递归函数中,首先判断糖果数量是否小于等于 1,如果是,则返回当前的操作次数;
  4. 如果糖果数量是偶数,递归调用 count(sum/2, count + 1),糖果数量除以 2,操作次数加一;
  5. 如果糖果数量是奇数,递归调用 Math.min(count(sum + 1, count + 1), count(sum - 1, count + 1)),分别对糖果数量加一和减一进行递归调用,取操作次数较少的结果;
  6. 返回最终的操作次数。

五、JavaScript算法源码

// 定义一个递归函数,用于计算能够分配的最大糖果数
function countCandies(sum, count) {
  // 如果将糖果平均分配后,每个人最多只能得到 1 颗糖果,直接返回当前计数值
  if (sum <= 1) {
    return count;
  }
  // 如果糖果总数是偶数,将糖果平均分配
  if (sum % 2 === 0) {
    return countCandies(sum / 2, count + 1);
  }
  // 如果糖果总数是奇数,将其加一或减一变为偶数,并递归计算
  return Math.min(
    countCandies(sum + 1, count + 1), // 加一后递归计算
    countCandies(sum - 1, count + 1) // 减一后递归计算
  );
}

六、效果展示

华为OD机试真题 JavaScript 实现【分糖果】【2022Q2 200分】,附详细解题思路_第1张图片


下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,javascript,开发语言,矩阵,ecmascript)