微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

函数退出循环为时过早

如何解决函数退出循环为时过早

我得到一个整数向量,其中每个数字代表袜子的颜色。我知道最好的解决方案是使用哈希集,但是我正在尝试采用蛮力方法解决问题。但是,找到第三个对后,我的循环开始变得有趣,因为它离开了内部循环,并且控制流再也没有回来。实际上,即使我小于n,即使外部循环也会过早停止。

我尝试使用调试器进行跟踪,但是我感到困惑,因为i或j都没有超过n,但是它停止了。有人可以指出我正确的方向吗?

#include <iostream>
#include <vector>
using namespace std;


int sockMerchant(int n,vector<int> ar) {
    int pair = 0;
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n - 1; j++) {
            if (ar[i] == ar[j] && ar[i] > 0) {
                pair++;
                ar[i] = 0;
                ar[j] = 0;
                break;
            }
        }
    }
    return pair;
}


int main() {
    vector<int> vec = {4,5,6,4,1,3,5};
    int n = 9;

    cout << sockMerchant(n,vec);

}

我的暴力破解方法是将匹配对变为已被访问的零。约束条件是袜子的颜色在1到100之间。如果找到一个不为零的匹配对,则将对计数器加1,并在完成循环后返回对。

解决方法

您正在传递等于9的参数n。但是,您将此值用作vector循环中for的循环边界,这是不正确的。

相反,您可以简单地将vector传递给函数(通过引用避免复制),并在那里计算边界:

int sockMerchant(vector<int>& ar) {
    int n = ar.size();
    // ...

并这样称呼它:

cout << sockMerchant(vec);

此外,您的循环计数器还远远不够。条件应为i < n,而不是i < n - 1

这些修正给出的结果为9,这是输入向量中匹配对的数量。这是demo

,

事实上,即使我小于n,即使是外循环也会过早停止。

在我的测试中,当i的值达到8时,循环中断,这对于您的条件i < n - 1是有意义的。也许您打算使用i < n

在不确定情况时打印诊断输出很有用。参见https://ideone.com/sR56AH

有用的链接:How to debug small programs

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。