我有下一个任务:给定一个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;
你能解释一下为什么它会这样运作吗?我认为理由是第二次发生的事情(...)
答案 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
。您首先需要检查所有元素。但是,如果您找到第一个false
或1
,则可以直接返回3
。这正是您的代码的第一个版本,正确。
请注意,当否定条件时,您需要否定所有量词和运算符。
第一个代码使用这个逻辑实现了一种方法:
1
或3
元素 ¬(∃ 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)
您正在实施短路评估。第一个版本是对的。在第二个版本中,当您遇到的数字不是true
或1
时,您会提前返回3
- 这是每个数字,因为{{1 }}不是1
,反之亦然。
答案 3 :(得分:0)
对于第二个答案,您使用的是OR
而不是AND
。因此,无论您提供什么价值,它都将始终进入if条件。
希望这会有所帮助。