本文为第五届青训营主题创作活动投稿,详情活动请点击=> 「青训营 X 码上掘金」
使用语言:C++
平台:(码上掘金 (juejin.cn))
算法初学,可能连题目意思都没明白,就按照我的理解做的。有误欢迎评论区指正~
点击script部分查看C++代码
题目解析
给定两个参数n和k,n需要等于k,k是固定的,需要操作n。
两种方案:1、n每次加1;2、n每次加n
基本就是这样的要求,不过这是我的理解。
后面也想到可能是错误的理解,因为如果这样的话题目确实是很简答就做出来了,没有挑战性,但我目前就只能想到这里了,先按照这个思路来解题吧!
代码拆解
题目中的两种方案很明显第二种方案是比较快的, 所以优先执行第二种方案,这里先直接进行n加的操作。
因为题目要求的是最快的时间,也就是一共执行了几次操作,先定义一个变量min并初始化用于存储最终的值。
第一次循环+
n按理来说开始是小于k的,先执行+的操作,执行一个while循环,直到N >= k;
开始写循环体内部,首先需要判断n是否等于0(题目允许等于0),如果为0则直接跳出本次循环,在这之前需要将n+1以便于之后的运算,同时记录操作数min++。
如果当前n * 2 <= k的话,就可以将n的节点移动到他的一倍n += n。如果不是,则老老实实给n和min加1继续执行下次循环即可。
第二次循环-
第一次循环执行完毕之后,这时候n的值一定是大于等于k的,这里也不用判断n是不是等于k;
直接再来一个while循环,循环n > k的情况,将n慢慢减一,减到n == k就可以啦~
不要忘了加操作数,最后输出min的值即可。
总结
思路很简单,没有用到任何算法。后面我越想越不对,比如同样的距离1-50和50-100的差距也太大了。
如果有会这道题的大佬可以点拨一下