【发布时间】:2020-09-24 22:13:21
【问题描述】:
我有这个逻辑,理想情况下应该在一个 int 数组中找到成对的 int,找到这对后,将它从数组本身中删除并重新开始。
在调试时我注意到,对于给定的示例输入测试用例,当 i=0 和 j=3 满足 if 条件并且找到 1st pair 然后 pairs值递增,然后两个值都按预期从数组中删除,n 从9 递减到7,然后将j 设置为0,现在,控制回到for语句,理想情况下,应该执行 j<n 的 for 循环体,但是,我在调试器中看到,当执行 for 语句时,j 设置为 1。
我不明白这一点。我的for 循环中的增量究竟是什么时候发生的,因为如果我只是将它设置为0 并且条件满足,控件应该继续寻找下一对?
/*
sample input case
9 (n number of inputs)
10 20 20 10 10 30 50 10 20 (array of ints)
*/
for (int i = 0; i < n; i++) {
for (int j = 1; j < n; j++) {
if (ar[i] == ar[j]) {
pairs++;
ar.erase(ar.begin() + i);
ar.erase(ar.begin() + j-1);
n-=2;
j = 0;
}
}
}
【问题讨论】:
-
循环的每次迭代后执行增量表达式。所以这发生在之后
j = 0; -
修复尝试设置
j = -1(虽然我对整体逻辑有疑问)。 -
for (a;b;c) d像{a; while (b) {d; c;}}一样执行 -
非常不建议在您也修改过的容器上进行迭代,此外,您要设置
j = i + 1而不是j = 1,对于i,请使用i < n - 1。 -
sort(begin(ar), end(ar)); ar.erase(unique(begin(ar), end(ar)), end(ar));完成。