我必须用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函数调用元素编号,并在块中的确切编号之后。 所以在我的代码中,代码块包含数字。
答案 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;