为什么性能测试在my solution上失败:
class Solution {
public int solution(int X, int Y, int D) {
return (int) Math.ceil((Y-X)/(float)D);
}
}
如何改进?
试验:
public class SolutionTest {
private Solution solution;
@Test
public void defaultTest(){
assertEquals(3, solution.solution(10,85,30));
}
@Test
public void many_jump1Test(){
assertEquals(499999998, solution.solution(-499999996,500000000,2));
}
@Before
public void init(){
solution = new Solution();
}
}
答案 0 :(得分:1)
我认为你的解决方案遇到了舍入错误,因为float
缺乏精确性。您的测试结果表明:
对于输入(3,999111321,7),解决方案返回了错误的答案(得到142730192预期为142730189)。
考虑到这些输入,如果我们使用(X - Y) / D
,并且使用float
,请让我们查看double
的结果:
float f = (999111321 - 3) / 7.0f; // 1.42730192E8
double d = (999111321 - 3) / 7.0; // 1.427301882857143E8
^^
请注意小数点前最后两位数的舍入误差。为了避免这种情况并获得正确的答案,您只需将D
投射到double
而不是解决方案中的float
。
答案 1 :(得分:0)
整数运算速度更快,可以使用整数除法:
(Y - X + D - 1)/ D
通常/ D会给出底价。为了获得ceil值,添加D - 1。
这可以保存