codility 题库 java_Codility FrogJmp奇怪的Java得分

所以我决定尝试Codility.第一项任务 – FrogJmp很容易,但令我惊讶的是我得了44%.解决方案,即使是正确的,在性能方面显然是不可接受的.

原始解决方案

public int solution2(int X, int Y, int D) {

return (int) Math.ceil((float)(Y -X)/D);

}

所以我决定用不同的代码尝试它,没有浮点运算.

public int solution(int X, int Y, int D) {

int diff = Y - X;

if (diff % D == 0)

return diff /D;

else

return diff/D + 1;

}

这次我得到了100%.所以我想自己检查性能并编写简单的测试:

class Solution {

public int solution(int X, int Y, int D) {

int diff = Y - X;

if (diff % D == 0)

return diff /D;

else

return diff/D + 1;

}

public int solution2(int X, int Y, int D) {

return (int) Math.ceil((float)(Y -X)/D);

}

private static Random ran = new Random(System.currentTimeMillis());

public static int getRandom(int a, int b){

return ran.nextInt(b - a + 1) + a;

}

public static void main(String[] args) {

int size = 1000_000;

int max = 1000_000_000;

int[] xs = new int[size];

int[] ys = new int[size];

int[] ds = new int[size];

for (int i = 0; i < size; i++) {

int y = getRandom(1, max);

int x = getRandom(1, y);

int d = getRandom(1, max);

xs[i] = x;

ys[i] = y;

ds[i] = d;

}

long start = System.nanoTime();

Solution sol = new Solution();

for (int i = 0; i < size; i++) {

sol.solution2(xs[i], ys[i], ds[i]);

}

long diff = System.nanoTime() - start;

System.out.println("took: " + diff/1000000 + "ms");

}

}

令我惊讶的是,在我的机器上,解决方案1平均需要13毫秒,而解决方案2(报告为绝对无效的10毫秒).

我错过了什么?

也许它必须对任务的预期时间和空间复杂性做一些事情.

expected worst-case time complexity is O(1); expected worst-case space

complexity is O(1).

解决方案2不具有恒定的时间和范围.空间复杂性?

另外,我无法理解44%解决方案的结果报告:

这是什么意思??

解决方法:

两种解决方案都具有O(1)时间复杂度.问题是第一个解决方案是返回错误的答案.性能测试测试答案和时间.您的解决方案失败可能是因为使用浮动的精确问题.

对于x = 1,y = 1000000000,d = 1,您的第一个解决方案给出1000000000作为答案,第二个给出

999999999.从(float)更改为(double)会更正此结果.

在这些算法测试中,尽可能避免浮点运算通常是一个好主意,以便更容易获得所有情况的确切答案.

标签:java,time-complexity

来源: https://codeday.me/bug/20190713/1454053.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值