java - Codility:缺少整数 - Java SE 8
问题描述
即,给定一个由 N 个整数组成的非空零索引数组 A,返回在 A 中不出现的最小正整数(大于 0)。例如,给定:
A[0] = 4
A[1] = 6
A[2] = 2
A[3] = 2
A[4] = 6
A[5] = 6
A[6] = 1
该函数应返回 4。假设:
换句话说,对于每个 K (0 <= K <= 50000),A[K] = 2,给定的实现工作太慢,但函数将返回 50,000
为以下假设编写一个有效的算法:
N is an integer within the range [1...100,000]
each element of array A is an integer the range [1..N]
我的回答还没有成功!它有什么问题?首先让我说明明显的错误
- 返回值 - 我在第一个结果中返回 4,这是成功的,但第二个返回是 1,这是不正确的,因为预期结果是 50,000
我的代码有效,但唯一的第一个结果是正确的,第二个不是。
import java.util.*;
class Solution {
int solution(int[] A) {
int[] AN = Arrays.stream(A).filter(n -> n > 0).distinct().sorted().toArray();
int N = AN.length;
int min = 1;
int i = 0;
while (i < N) {
min = i+1;
if (min == N) {
min = Math.max(min , Math.abs(i-N));
}
i++;
}
return min;
}
}
解决方案
注意:在您给出的示例中,缺少的整数是3
而不是4
性能问题可能是由使用distinct
and引起的sorted
。
我将创建一个基于排序数组的算法,所以它的复杂度是O(n log n)
.
首先我们对数组进行排序:
Arrays.sort(A);
接下来我们跳过负数或零数
while (i < A.length && A[i] <= 0)
i++;
如果现在数组已完全解析或当前元素A[i]
不是 1,则解为 1。
如果不是这样,我们继续解析数组A
,我们将missing
变量初始化为 1,如果当前元素等于缺失的元素,我们递增i
,或者如果当前元素相等missing + 1
,我们递增missing
,否则我们停止,我们找到缺失的整数。
最后,如果我们的数组被完全解析并且没有任何不匹配missing variable
,A[i]
那么我们递增missing
.
完整代码:
Arrays.sort(A);
int missing = 1;
int i = 0;
while (i < A.length && A[i] <= 0)
i++;
if (i < A.length && A[i] == 1) {
while (i < A.length) {
if (A[i] == missing) {
i++;
} else if (A[i] == missing + 1) {
missing++;
} else {
missing++;
break;
}
}
missing = i >= A.length ? missing + 1 : missing;
}
System.out.println(missing);
推荐阅读
- python - 获取特定评论 Facebook 用户下载的 comments.json
- php - 我如何使具有动态值的引用 url 前缀可以在所有网站中访问
- linux - 内核线程与用户线程之间的上下文切换
- android - 与同等仪器测试相比,使用 Robolectric 的运行时间更慢
- sql - 如何在 ASP 中获取下拉列表值作为 SQL 命令的数字
- java - 有没有办法像在 laravel 中一样在 Android (java) 中使用 .env 变量?
- hyperledger - 为什么 Iroha 共识需要几秒钟?
- sql-server - 如何根据组数划分产品数量
- r - tidyr VS dplyr + reshape2
- excel - 检查两个单元格是否匹配特定值以创建 MsgBox