gpt4 book ai didi

java - 查找下一次出现次数最少的第一个重复项

转载 作者:行者123 更新时间:2023-11-29 08:29:32 25 4
gpt4 key购买 nike

我正在尝试解决一个挑战,我写了我的解决方案,它通过了所有测试用例,除了一些隐藏的测试用例。我想不出我的方法失败并且不知道该怎么做的另一种情况。在这里:

int firstDuplicate(int[] a) {

int[] indexCount;
int duplicate, temp;
boolean check;

duplicate = -1; temp = a.length;
indexCount = new int[a.length];
check = false;

for( int i = 0; i < a.length; i++ ){

if( indexCount[a[i]-1] == 0 ){
indexCount[a[i]-1] = i+1;
check = false;
}else{
indexCount[a[i]-1] = (i+1) - indexCount[a[i]-1];
check = true;
}
if( check && indexCount[a[i]-1] < temp ){
duplicate = a[i];
temp = indexCount[a[i]-1];
}
}
return duplicate;

说明是:

用 O(n) 的时间复杂度和 O(1) 的额外空间复杂度编写一个解决方案。给定一个仅包含 1 到 a.length 范围内的数字的数组 a,找到第一个重复数字,其中第二次出现的数字具有最小索引。

例子

对于 a = [2, 3, 3, 1, 5, 2],输出应该是firstDuplicate(a) = 3.

有 2 个重复项:数字 2 和 3。第二次出现的 3 的索引小于第二次出现的 2 的索引,所以答案是 3。

对于 a = [2, 4, 3, 5, 1],输出应该是firstDuplicate(a) = -1.

最佳答案

这是我的。在 O(n) 中运行并使用 O(1) 空间。如果我在这里错了,请纠正我。

由于我的输入值不能超过长度,我可以使用 mod 运算符对同一数组进行索引,并将长度添加到索引中的值。一旦我遇到一个大于长度的值,这意味着我之前已经增加了它,这给了我重复的值。

public int firstDuplicate(int[] arr) {
int length = arr.length;

for (int i = 0; i < length; i++) {
int expectedIndex = arr[i] % length;
if (arr[expectedIndex] > length) {
return arr[i] > length ? arr[i] - length : arr[i];
} else {
arr[expectedIndex] += length;
}
}

return -1;
}

关于java - 查找下一次出现次数最少的第一个重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49471295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com