【发布时间】:2015-01-27 19:29:24
【问题描述】:
今天我听说了一个名为 codility 的网站,用户可以在该网站上进行各种编程测试以检查其代码的性能。
当我开始时,他们向我展示了这个示例测试,
任务描述一只小青蛙想要到达另一边 路。青蛙当前位于位置 X 并想到达 大于或等于 Y 的位置。小青蛙总是跳 固定距离,D。计算最小的跳跃次数 青蛙必须执行才能达到目标。
写一个函数:
class Solution { public int solution(int X, int Y, int D); }即,给定三个整数X、Y和D,返回从位置X到等于或大于Y的位置的最小跳转次数。例如, 给定:
X = 10Y = 85D = 30函数应该返回3, 因为青蛙的位置如下:第一次跳跃后, 在位置 10 + 30 = 40
第二次跳跃后,位置 10 + 30 + 30 = 70
第三次跳跃后,位置 10 + 30 + 30 + 30 = 100
假设:X、Y、D为范围内的整数
[1..1,000,000,000]; X ≤ Y。复杂度:预期最坏情况时间
复杂度为 O(1);预期的最坏情况空间复杂度为 O(1)。
这个问题很简单,我花了大约 2 分钟来写解决方案,下面是,
class Solution {
public int solution(int X, int Y, int D) {
int p = 0;
while (X < Y){
p++;
X = X + D;
}
return p;
}
}
但是,测试结果显示我的代码的性能只是20%,而我的得分只是55%,
这是结果的链接,https://codility.com/demo/results/demo66WP2H-K25/
这么简单的代码,我只用了一个while循环,怎么可能做得更快?
【问题讨论】:
-
使用除法?你必须走2389米。你走的每一步都是1米。你需要多少步?
-
基于@JB 的评论,系统会询问您 D 进入 Y-X 的次数(如果有余数,则四舍五入)。
-
在 C 中:返回 (y-x)/d + ((y-x)%d!=0);
-
他们已经很清楚地说预期的复杂性是 O(1),而您的解决方案的复杂性是 O(Y-X)。也就是说,O(n)。这个问题不需要循环。
标签: java