华为OD机试E卷 - 分糖果(Java & Python& JS & C++ & C )

最新华为OD机试

真题目录:点击查看目录
华为OD面试真题精选:点击立即查看

题目描述

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

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

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

输入描述

抓取的糖果数(<10000000000):15

输出描述

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

示例1

输入

15

输出

5

说明

15+1=16;16/2=8;8/2=4;4/2=2;2/2=1;

示例2

输入

6

输出

3

说明

6/2=3,3-1=2,2/2=1

解题思路

题目要求的是找出最少的操作次数,使得手中的糖果数从给定数量减少至仅剩一颗。每次操作包括取出糖果、放回糖果以及平分糖果。这个问题实质上是一个贪心算法的应用,目标是尽快将糖果数量减至1。

  • 循环直到糖果数为1。

    在循环中,检查当前糖果数是否为奇数。

    • 如果是奇数,检查加1后的数或减1后的数哪一个更适合下一步操作(即哪个能被2整除)。这里的贪心选择基于加1后能否被4整除,因为如果能被4整除,说明下一步可以继续平分两次。
  • 特殊处理当糖果数为3的情况,因为这是最快减至1的路径。

  • 每进行一次操作(不管是加1、减1还是分配),计数器加1。

Java

 

import java<

你可能感兴趣的:(最新华为OD机试真题,华为OD机试真题,(Java/JS/Py/C),java,python,javascript,c++,华为OD2025A卷,华为od)