【发布时间】:2021-01-25 06:55:51
【问题描述】:
这是来自 Leetcode 的一个问题,如下所示。
"给定一个偶数长度为 n 的整数数组 arr 和一个整数 k。 我们希望将数组精确地划分为 n / 2 对,使得每对的总和可以被 k 整除。 如果你能找到方法,则返回 true,否则返回 false。”
下面列出未完成的答案,
#include <stdio.h>
#include <limits.h>
#include <stdbool.h>
bool main() {
int arr[] = {1, 2, 3, 4, 5, 10, 6, 7, 8, 9};
int k = 5;
int arrSize = sizeof(arr)/sizeof(arr[0]);
int pairs = arrSize / 2;
for (int i = 0; i < arrSize && arr[i] != INT_MIN; i++) {
for (int j = i + 1; j < arrSize && arr[j] != INT_MIN; j++) {
if ((((long)arr[i] + arr[j]) % k) == 0) {
pairs--;
if (pairs == 0)
return true;
arr[j] = INT_MIN;
break;
}
}
}
return false;
}
除了答案是对还是错之外,我对 for 循环的多个条件的使用感到困惑。
我预计外部 for 循环将运行到 i == arrSize - 1,但出乎我的意料,它会在 i == 1 和 j == 2 处停止。
我将条件从arr[i] != INT_MIN && i < arrSize 改写为arr[i] != INT_MIN, i < arrSize,然后就可以了。
我更喜欢&&,但就是不知道为什么它不起作用。
我不知道为什么会这样。
请阐明它。
附言只留下负面评价真是太可怕了。
【问题讨论】:
-
由于读取超出数组末尾,该程序具有未定义的行为。在尝试访问数组之前,您必须先进行数组结束测试。查看 C 中逻辑运算符的短路评估。
-
@paddy 怎么会!我将最后一个索引控制为
arrSize - 1。不是吗? -
当然,
i < arrSize在i == arrSize时会评估为假,但在发生这种情况之前你已经测试了arr[i] != INT_MIN,这意味着你从arr[arrSize]和那 是未定义的行为。在您的j-loop 中也是如此。 -
@paddy 你是对的。但现在我只关注 for 循环中的多个条件问题。这就是我的问题。
-
问题是,如果您的程序中有未定义的行为,而您忽略了它,那么您所追求的问题可能只是一个幽灵。除了看到未定义的行为之外,我不会进一步分析您的程序。这就是我停下来的地方。