I've just taken the codility test on finding perfect squares in a range. I thought it was pretty straightforward, but on submitting, I got that a 50% on correctness and 66% on performance.
The spec also mentioned that range will be between [-2147483648 ... 2147483647], expected worst-case time complexity is O(sqrt(abs(B)))
and expected worst-case space complexity is O(1).
This is my code:
Solution1.java
public class Solution1 {
public int solution(int A, int B) {
int upperLimit = (int) Math.sqrt(B);
int squares = 0;
for (int i = 1; i <= upperLimit; i++) {
if (i * i >= A && i * i <= B) {
squares++;
}
}
return squares;
}
}
Solution1Test.java
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class Solution1Test {
private final Solution1 solution1 = new Solution1();
@Test
public void given4_17_return3() {
assertEquals(3, solution1.solution(4, 17));
}
@Test
public void given1_17_return4() {
assertEquals(4, solution1.solution(1, 17));
}
@Test
public void given1_35_return5() {
assertEquals(5, solution1.solution(1, 35));
}
@Test
public void given1_36_return6() {
assertEquals(6, solution1.solution(1, 36));
}
@Test
public void given9_49_return5() {
assertEquals(5, solution1.solution(9, 49));
}
@Test
public void given3000_3300_return3() {
assertEquals(3, solution1.solution(3000, 3300));
}
}
I'm specially concerned (and confused) about the 50% on correctness.
PS: it this is off-topic just let me know and I'll ask on stackoverflow.