当前位置: 首页 > 知识库问答 >
问题:

为什么我得到一个无限循环,当我使用int而不是整数在Java?

查锦程
2023-03-14

我正在努力解决这个问题1438。绝对差值小于或等于极限的最长连续子阵列。我明白了逻辑,但有一个非常奇怪的问题,我不得不拉扯头发两个多小时。

代码如下:-

class Solution {
    public int longestSubarray(int[] nums, int limit) {
        Deque<Integer> maxDeque = new LinkedList();
        Deque<Integer> minDeque = new LinkedList();
        Queue<Integer> queue = new LinkedList();

        int maxLength = 1;

        for (int i = 0; i < nums.length; i++) {
            Integer temp = nums[i];
            //int temp = nums[i]; //If I uncomment this line and comment the above line, the code does not work.
            queue.offer(temp);

            while (!maxDeque.isEmpty() && maxDeque.peekLast() < temp) {
                maxDeque.removeLast();
            }

            while (!minDeque.isEmpty() && minDeque.peekLast() > temp) {
                minDeque.removeLast();
            }

            maxDeque.offerLast(temp);
            minDeque.offerLast(temp);

            while (maxDeque.peekFirst() - minDeque.peekFirst() > limit) {
                if (queue.peek() == maxDeque.peekFirst()) {
                    maxDeque.pollFirst();
                }

                if (queue.peek() == minDeque.peekFirst()) {
                    minDeque.pollFirst();
                }

                queue.poll();
            }

            
            maxLength = Math.max(maxLength, queue.size());

        }

        return maxLength;
    }
}

您可以看到,当我将一个整数放入每个队列时,代码运行良好,但当我将一个int放入三个队列时,我得到一个TLE。因此,在下面的代码中,如果temp是intger,则代码通过,但当temp是int时,它会给出一个TLE。有人能解释一下发生了什么吗?

共有1个答案

巫马修为
2023-03-14

不要使用==来比较intgers。由于引用相等,它仅在您预装箱temp时起作用。改用. equals()

if (queue.peek().equals(maxDeque.peekFirst())) {
    maxDeque.pollFirst();
}

if (queue.peek().equals(minDeque.peekFirst())) {
    minDeque.pollFirst();
}
 类似资料:
  • 我与Wildfly和OpenJPA合作。我有一个乐观锁例外的情况。 我得到的错误消息是: 00:08:29373警告[com.arjuna.ats.arjuna](默认任务-39)arjuna01225:TwoPhaseCoordinator。beforeCompletion-SynchronizationImple失败 :org.apache.openjpa.persistence.乐观锁定异常

  • 我是Java新手。我正在尝试遍历一个文件并将每个字符串写入ArrayList。为此,我有如下代码: 然而,由于某种原因,这段代码陷入了无限循环。即使我将打印语句作为当块的第一行,它也不会执行。 accountData.txt文件是这样排列的: 我已经读了很多遍,经常读到这是个问题,因为人们没有用Scanner.next()来移动指针,但我相信我正在这样做。我不知道哪里出了问题。 感谢您的帮助!

  • 这是我的代码: 所以这里有一个无限循环错误(Stackoverflow)。但是,如果我注释掉我创建的两个对象中的任何一个,这都没关系。 我的代码中的对象如何导致Stackoverflow错误?

  • 问题内容: public class GuardedBlock { 我正在通过Java Essentials教程学习并发性。找到了守卫的方块并尝试对其进行测试。我无法理解的一件事。 虽然循环是无限的,但是如果您取消注释threadMessage行,则一切正常。为什么? 问题答案: 简短答案 您忘了声明为易失性布尔值。 如果您将字段声明省略为,则不会告诉JVM该字段可以被多线程看到,例如您的示例。

  • 问题内容: 我试图用groovy为Swagger页面编写Selenium对象构建器。为了便于讨论,我的问题代码可以简化为以下几种: 调用它非常简单(来自JUnit3): 该构造函数是一个可怕的眼睛痛!我试图用以下等待替换它: 要么: 两者都产生了相同的结果:以开头的行中的闭包中的“ org.openqa.selenium.StaleElementReferenceException:元素不再连接到

  • 问题内容: 我一直在使用“ if”来测试自己的版本,并且一切似乎都正常。当然,如果使用signalAll()而不是signal(),这将导致严重崩溃,但是如果一次仅通知一个线程,这怎么会出错? 他们的代码在这里 -检查put()和take()方法;在Condition的JavaDoc顶部可以看到一个更简单,更重点的实现。 下面是我实施的相关部分。 PS我知道,通常,尤其是在这样的lib类中,应该让