下面的代码是一个函数,它将循环遍历数组并检查整数数组是否已排序,如果已排序则返回true,否则返回false。我的一个朋友帮了我,但我忘了他的解释是什么。对于if语句,我很难理解它在说什么。如果数组的每个索引(array[i])都大于数组的每个索引加1 (array[i+1]),那么变量tell为假。例如,如果数组[31,4,99,23,8]大于[31+ 1,4 + 1,99 + 1,23 + 1,8 +1]返回false?混淆主要来自于"array[i+1]"到底是什么。提前谢谢你。
function isSorted(arr) {
var tell = true;
for (var i = 0; i < arr.length; i++) {
if (arr[i] > arr[i + 1]) {
tell = false;
}
}
return tell
}
arr[i]
是迭代中数组的当前元素。arr[i + 1]
是下一个元素
您的if
语句所说的是"如果当前元素大于下一个元素,则将tell
设置为false"(因为这意味着数组未排序)。
在这段代码中有一个off-by- 1的错误,因为它查看数组末尾以外的元素。正确的实现应该是:
function isSorted(arr) {
var tell = true;
for (var i = 0; i < arr.length - 1; i++) { // <-- loop up to the second-to-last element
if (arr[i] > arr[i + 1]) {
tell = false;
}
}
return tell
}
arr[x]表示数组中位置为'x'的对象
如果你的数组是[z, x, d, r],那么位置0的对象是"z",位置1的对象是"x",位置2的对象是"d",位置3的对象是"r"。所以arr[0]是"z",arr[2]是"d",等等。
您的代码正在检查位置i
的任何对象是否大于数组中的下一个对象(即位置i+1
的对象)
上面写着:
- 设置
tell
标志为true,因此除非我们找到数组未排序的原因,否则我们将返回true作为答案。 - 现在,对于每个元素
arr[i]
和它的下一个元素arr[i+1]
,做以下检查:如果第一个大于下一个,这意味着我们有类似[..., 3, 2,...]
的情况,所以我们知道数组没有排序。为了表示这一点,我们将tell
标志设置为false
。
+1不是Value +1,而是下一个元素。所以在第一个循环中i是0。然后if检查,如果位置0处元素的值大于元素1的值(0 + 1),则返回false
arr[i]
是索引为i
的元素。arr[i + 1]
是索引为i + 1
的元素。它是下一个元素
if检查当前元素是否大于下一个元素。如果每个元素都比下一个元素大,那么这意味着数组是按降序排序的。如果你的数组是[8, 6, 5, 1]
,那么8 > 6 > 5 > 1
。如果你的数组是[8, 9, 5, 1]
,那么它不会被排序,因为8 < 9 > 5 > 1
.