我一直在尝试解决 Codility 网页上的 Java 练习。
以下是上述练习的链接和我的解决方案。
https://codility.com/demo/results/demoH5GMV3-PV8
谁能告诉我可以在我的代码中纠正什么以提高分数?
以防万一这里是任务描述:
一只小青蛙想去河的另一边。青蛙当前位于位置 0,并想到达位置 X。树叶从树上掉到河面上。
给定一个非空的零索引数组 A,由 N 个表示落叶的整数组成。A[K] 表示在时间 K 时一片叶子落下的位置,以分钟为单位。
目标是找到青蛙可以跳到河对岸的最早时间。只有当树叶出现在从 1 到 X 过河的每个位置时,青蛙才能过河。
例如,给定整数 X = 5 和数组 A,这样:
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
在第 6 分钟,一片叶子落入位置 5。这是最早出现叶子出现在河对岸的每个位置的时间。
写一个函数:
class Solution { public int solution(int X, int[] A); }
即,给定一个由 N 个整数和整数 X 组成的非空零索引数组 A,返回青蛙可以跳到河对岸的最早时间。
如果青蛙永远不能跳到河的另一边,函数应该返回-1。
例如,给定 X = 5 和数组 A 使得:
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
如上所述,该函数应返回 6。假使,假设:
N and X are integers within the range [1..100,000];
each element of array A is an integer within the range [1..X].
复杂:
expected worst-case time complexity is O(N);
expected worst-case space complexity is O(X), beyond input storage (not counting the storage required for input arguments).
可以修改输入数组的元素。
这是我的解决方案:
import java.util.ArrayList;
import java.util.List;
class Solution {
public int solution(int X, int[] A) {
int list[] = A;
int sum = 0;
int searchedValue = X;
List<Integer> arrayList = new ArrayList<Integer>();
for (int iii = 0; iii < list.length; iii++) {
if (list[iii] <= searchedValue && !arrayList.contains(list[iii])) {
sum += list[iii];
arrayList.add(list[iii]);
}
if (list[iii] == searchedValue) {
if (sum == searchedValue * (searchedValue + 1) / 2) {
return iii;
}
}
}
return -1;
}
}