如何在c ++中找出最长的永久序列(增加或减少)?

时间:2019-10-06 09:04:05

标签: c++ for-loop if-statement sequence

我必须用C ++编写一个程序,该程序可以选择管理2到1000个元素的序列。最后,程序必须找出最长的递增或递减序列的元素数。

示例:

6; 1; 2; 3; 2; 4; 1;输出:3; (因为:1; 2; 3是包含3个元素的最长记录)

6; 4; 3; 1; 5; 2; 1;输出:4; (因为:6; 4; 3; 1是最长的,包含4个元素)

我厌倦了以下代码和工作方式。问题在于它不能给出最长的序列,而每次给出的都是最后序列的数量。

不幸的是,我找不到错误或问题。有人可以帮忙吗?

int counting = 1;
int counting_max = 0, counting_min = 0;

for (int i = 1; i < n; ++i) {
        if(block[i] < block[i+1]) {
            if(block[i]-block[i-1]>0) {
                counting++;
                    if(counting>counting_max) {
                    counting_max = counting;
                }}
                else {
                    counting = 1;
                }
            }

        if(block[i] > block[i+1]) {
            if(block[i]-block[i-1]<0) {
                counting++;
                    if(counting>counting_min) {
                    counting_min = counting;
                }}
                else {
                    counting = 1;
                }
            }
}
        if(counting_max >= counting_min) {
            cout<< counting_max;
        }
        else {
            cout<< counting_min;
        }


return 0;}

在我的代码中,我没有共享第一部分,因为我认为它可以正常工作。 第一个只是一会儿,for函数调用元素编号,并在块中的确切编号之后。 所以在我的代码中,代码块包含数字。

2 个答案:

答案 0 :(得分:1)

在您发布的代码中,由于您正在循环中访问block,因此外循环创建了block[i+1]数组的越界访问。这可能是您的代码在一个方向而不是另一个方向产生正确答案的原因。

除此方法外,您还可能遇到其他一些问题:

  • 如果最终选择最大的计数器,则可能无需跟踪两个单独的计数器。您可以跟踪最大序列,而不管它是增加还是减少。
  • 由于您测试了数组中三个元素之间的关系以查看序列是否在增加/减少,因此当列表中的元素少于三个时,您将不得不添加额外的逻辑来处理。
  • 您需要注意何时重复相同的数字,因为这可能不会算作增加或减少。

这是涵盖以下内容的修订版:

int counting = std::min(n, 1);
int counting_max = counting;

for (int i = 0; i < n - 1; ++i) {
    if (
        block[i] < block[i + 1] &&
        (counting < 2 || block[i] > block[i - 1])
    ) {
        counting++;
    } else if (
        block[i] > block[i + 1] &&
        (counting < 2 || block[i] < block[i - 1])
    ) {
        counting++;
    } else if (block[i] == block[i + 1]) {
        counting = 1;
    } else {
        counting = 2;
    }

    if (counting > counting_max) {
        counting_max = counting;
    }
}

cout << counting_max << "\n";

答案 1 :(得分:0)

尝试以下替代代码:counting_max查找最长的升序,counting_min查找最长的降序(通过减少其循环计数器),最后,我们比较它们以找到最终的最长序列(假设我们有n-1个元素,如果没有相应地更改它)

for (int i=1,j=n-2; i<n && j>=0; ++i,--j) {
    if (block[i] - block[i - 1]>0) {
        counting++;
        if (counting>counting_max)
        counting_max = counting;
    }
    else
    counting = 1;
    if (block[j] - block[j + 1]>0) {
        counting_back++;
        if (counting_back>counting_min)
        counting_min = counting_back;
    }
    else
    counting_back = 1;
    }

if (counting_max >= counting_min)
cout << counting_max;
else
cout << counting_min;