【发布时间】:2017-09-11 16:13:03
【问题描述】:
问题陈述: 找出从 0(零)到达目标数字 x 所需的最小步数,仅使用两个操作:+1 (数字加 1) 或 *2 (将 2 与数字)。
这是我想出的逻辑:
最好的方法是向后工作。从你需要的号码开始:
- 如果数字是奇数,则减 1。
- 如果是偶数,则除以 2。
- 到零时停止。
例如,对于 29,您得到 28、14、7、6、3、2、1、0。
还有,这是我尝试过的(Java 7):
kValues 是一个包含 x 值的数组,需要计算 steps 的值并将其存储在名为 result 的数组中。
static int[] countOperationsToK(long[] kValues) {
int size = kValues.length,x,i,steps;
int result[] = new int[size];
for (i = 0; i < size; ++i)
{
steps = 0;
for (x = (int)kValues[i]; x != 0 ; ++steps)
{
if((x % 2) == 0)
x /= 2;
else x--;
}
result[i] = steps;
}
return result;
}
我的问题:
这是一个 Hackerrank 问题,我应该编写一个高效的代码。我成功完成了 7/11 测试用例,而其他测试用例超时。由于这是一个 Hackerrank 问题,因此我无法更改函数定义或返回类型。这就是我在for 循环中从long 转换为int 的原因,以便使用%(模数)。我想知道我哪里出错了。我的算法计算时间是否太长(对于接近一百万的值的数量)?显然是这样,但是我如何更改我的算法以通过所有测试用例?
提前谢谢你:)
【问题讨论】:
-
这被标记为 python 有什么原因吗?
-
这也被标记在 python 下,因为我认为 python 可以提供更好的解决方案。所以,如果碰巧任何 python 人看到这段代码并说“我可以在几秒钟内降低时间复杂度”。所以是的......@Stael
-
你得到了什么判决? TLE 还是 WA?
-
演员阵容可能会导致问题。请参阅 here 以在
longs 上使用模数。 -
我收到“因超时而终止”错误
标签: java python algorithm mathematical-optimization