java—理解一个编码在数组中查找第一个重复值时很有挑战性

jhkqcmku  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(205)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

上个月关门了。
改进这个问题
我目前正在练习我的编码技能,我遇到的挑战之一是找到数组中产生的第一个重复值。我已经解决了这个挑战,但没有及时解决。我看了这个问题的解决方案,遇到了这个解决方案,希望能帮助我理解它到底是如何工作的。我已经在我理解的区域中对解决方案进行了注解,以及该代码块的具体用途,但是我想帮助您理解if语句为什么它是这样工作的。

int firstDuplicate(int[] a) {
    for(int i=0;i<a.length;i++)
        //Checks ???????????
        if(a[Math.abs(a[i])-1]<0)
            return Math.abs(a[i]);
        //Make the checked value negative
        else{
            a[Math.abs(a[i])-1]=-a[Math.abs(a[i])-1];
        }
    //If there are no duplicates it returns -1
    return -1;
}

约束条件:

1 ≤ a.length ≤ 105,
1 ≤ a[i] ≤ a.length.
u3r8eeie

u3r8eeie1#

欢迎来到so。我不会给你确切的答案,而是为你提供工具,让你弄清楚。
为了让您理解这段代码,您需要调试它。这里有一些方法你可以去做。
在调用函数之前设置一个断点(查看ide的实现方法),然后逐行进入代码。
可以使用临时变量和 System.out.println() 声明。查看代码,将其分解为可跟踪的模块位。例如,您可以在 if 声明为

int currentElementAbsolute = Math.abs(a[i]);
System.out.println(currentElementAbsolute);

int difference = currentElementAbsolute - 1;
System.out.println(difference);

int element = a[difference]
System.out.println(element);

if (element < 0)
{
   return Math.abs(a[i]);
}

如您所见,对于每个操作/行,我打印出当前值,从而跟踪事件。练习这个并重新写下 else 零件
注:完成后,你会意识到这种方法无法捕捉到所有的重复时,某些类型的数字是使用。狩猎快乐:)

相关问题