python实现:魔法币问题(网易2018校园招聘编程题(牛客))

问题:

小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。

题目牛客网地址链接:https://www.nowcoder.com/test/question/32c71b52db52424c89a565e4134bfe4e?pid=6910869&tid=21504073


输入描述:

输入包括一行,包括一个正整数n(1 ≤ n ≤ 10^9),表示小易需要的魔法币数量。

输出描述:

输出一个字符串,每个字符表示该次小易选取投入的魔法机器。其中只包含字符'1'和'2'。

输入例子1:

10

输出例子1:

122

解题思路:

      分析:这是一道比较容易让人迷惑的题,至少让我迷惑了。因为这个让我想起了之前碰到的这道题,具体参考这篇博文:https://mp.csdn.net/postedit/87930525。看完,会不会想到用同样的方式去解决这道题呢?

    进入正题,这道题,其实是一个找规律题。需要从下往上走解决,算法就会很高效。具体,动手画出来,答案或者说规律,就很容易发现,每一步有两种选择,因此用二叉树呈现再合适不过了。如下手工图所示,可以发现:

    1)节点值的规律:除了根节点,右子节点都是偶数,左子节点都是奇数。也就是说,偶数都经过机器2来实现,奇数经过机器1来实现;

    2)父节点和其孩子节点的规律:假定右子节点值为变量R,左子节点值为变量L,父亲节点值为F,则有F等于R整除2减去1;F等于L整除2。   

 据此两条规律,我们考虑的详细实现步骤如下:

    1)变量设置。结果要求返回字符串,因此,设定一个变量result为空字符串,来保存我们的结果值,无须其他变量辅助了;

    2)节点值的递进关系处理。实现从两个魔法机器中得到需要的n个魔法币,也就是我们二叉树中的某个子节点值为n,然后一步步回到根节点经过的机器路径反向输出而已。即当根节点的值等于0时停止迭代,返回结果值。否则继续迭代,所以我们用while来实现。

经过上述两步,即可得到我们想要的结果。


python具体实现如下:

def magicRoad(nums):
    result = ''               #保存路径值
    while nums>0:             # 当根节点不为零,继续迭代
        if nums%2 ==0:        # 根节点为偶数,变换方法,路径添加机器2,注意反向添加
            nums = nums//2-1
            result = '2'+result  
        else:                # 根节点为奇数,变换方法,路径添加机器1          
            nums = nums//2
            result = '1'+result
    return result


x = 0
n = int(input())
print(magicRoad(n))

题外话:

       这道题,如在分析时所说,把自己迷惑了,脑袋第一次反应的就是遍历路径,程序的话,就是递归实现,完全没有仔细考虑这样实现的后果及程序复杂度。当然,这样我也没有做出来,才开始动手画,到底是个什么鬼,题目看着挺简单的呀,这才发现了这道题的真谛,产生了上述的解决思路。然后三两下就实现了,看到提交成功的页面,不能更开心呀。

      一点小感触:看到题目,先动手纸本上画画,不要盲目的就开始作答,或许,意外就在下个路口呢


猜你喜欢

转载自blog.csdn.net/weixin_42521211/article/details/88054057