为什么我在这里得到不同的结果

时间:2017-10-14 12:13:21

标签: java arrays boolean

我有下一个任务:给定一个int数组,如果数组不包含1和3,则返回true。

第一个版本,它是正确的:

for (int i = 0; i < nums.length; i++){
    if(nums[i] == 1 || nums[i] == 3)
        return false;
}
return true;

但在这里我得到了许多错误的测试:

for (int i = 0; i < nums.length; i++) {
    if (nums[i] != 1 || nums[i] != 3)
        return true;
}
return false;

你能解释一下为什么它会这样运作吗?我认为理由是第二次发生的事情(...)

4 个答案:

答案 0 :(得分:2)

如果没有 true s 且没有 1,代码返回3

让我们看一下第二个代码

// Iterate all values
for (int i = 0; i < nums.length; i++) {
    // Return true if value is not 1 OR not 3
    if (nums[i] != 1 || nums[i] != 3)
        return true;
}

// Return false
return false;

此处的关键是条件val != 1 || val != 3重言式,即所有情况中的true。假设值5 1,则返回true。现在假设1的值为1,但 3,同时返回true

您需要将||替换为&&,这意味着,这也更能反映您的文字状况:

  

如果数组不包含1 no 3&#39>,则返回true

但是,如果找到的第一个元素不是true而不是1,则无法直接返回3。您首先需要检查所有元素。但是,如果您找到第一个false1,则可以直接返回3。这正是您的代码的第一个版本正确

请注意,当否定条件时,您需要否定所有量词运算符

第一个代码使用这个逻辑实现了一种方法:

  • 不(存在一个13元素
  • ¬(∃ e : e = 1 ∨ e = 3)

当现在解决否定时,你会得到这样的逻辑:

  • 所有 元素 1 而非 3
  • ∀ e : e ≠ 1 ∧ e ≠ 3

所以存在)转向代表所有),=转为 )到)。

答案 1 :(得分:1)

为什么第一个工作

如果任何项目不是1或3,则返回false;如果没有项目匹配,则返回true

为什么第二个不起作用

它一直返回true(如果任何项不等于1或3,并且没有整数等于1和3),获取false的唯一方法是将它传递给空数组。

答案 2 :(得分:0)

您正在实施短路评估。第一个版本是对的。在第二个版本中,当您遇到的数字不是true1时,您会提前返回3 - 这是每个数字,因为{{1 }}不是1,反之亦然。

答案 3 :(得分:0)

对于第二个答案,您使用的是OR而不是AND。因此,无论您提供什么价值,它都将始终进入if条件。

希望这会有所帮助。