为什么我的解决方案的性能测试失败:
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();
}
}
我认为您的解决方案遇到了舍入误差,因为float
缺乏精度。您的测试结果指出:
对于输入(3、999111321、7(,解决方案返回了错误的答案(142730192预期的142730189(。
给定该输入,让我们看一下如果我们使用 float
以及如果我们使用 double
(X - Y) / D
的结果:
float f = (999111321 - 3) / 7.0f; // 1.42730192E8
double d = (999111321 - 3) / 7.0; // 1.427301882857143E8
^^
请注意小数点前最后两位数字的舍入误差。为了避免这种情况并获得正确的答案,您只需将D
转换为解决方案中的double
而不是float
。
整数运算要快得多,可以使用整数除法:
(Y - X + D - 1) / D
通常/ D
会给出下限值。为了获得 ceil 值,D - 1
.
这样可以节省:
double
分部- 采取
Math.ceil()
- 转换为
int