我有下一个任务:给定一个整数数组,如果该数组不包含 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;
你能解释一下为什么它会这样工作吗?我认为原因是第二个 if(...) 发生了一些事情
最佳答案
如果没有 1
且没有应该返回true
> 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
返回。
您需要将 ||
替换为 &&
,这意味着 和,这也能更好地反射(reflect)您的文本条件:
return true if the array contains no 1's and no 3's
但是,如果您找到的第一个元素既不是 1
也不是 3
,则不能直接返回 true
。您首先需要检查所有元素。但是,如果找到第一个 1
或 3
,则可以直接返回 false
。这正是您的代码的第一个版本,它正确。
请注意,当否定条件时,您还需要否定所有量词和运算符。
第一个代码使用此逻辑实现了一种方法:
- 否(存在一个
1
或3
元素) Ø(∃ e : e = 1 ∨ e = 3)
现在解决否定时,您会收到以下逻辑:
- 所有元素都不是
1
并且不是3
∀ e : e ≠ 1 ∧ e ≠ 3
因此,∃
(存在)变为∀
(对于所有),=
到 ≠
和 ∨
(或)到 ∧
(和)。
关于java - 为什么我在这里得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46744402/