前一个较大数字代码中的输出不正确
Posted
技术标签:
【中文标题】前一个较大数字代码中的输出不正确【英文标题】:Incorrect output in Immediate Previous Larger Number code 【发布时间】:2017-10-16 11:10:03 【问题描述】:Que:N 个数字作为输入传递给程序。程序必须打印前一个较大的数字。如果没有更大的数字,则为该特定数字打印 0。
注意:由于 N 可以高达 100000,因此请优化您的算法以避免超时。
输入格式:第一行包含N,第二行包含N个数字,用空格隔开。
输出格式:第一行包含 N 个数字,表示前一个较大的数字。
边界条件:2
示例输入/输出 1:输入:11 455 346 76 304 488 374 385 433 350 9 1000
输出:0 455 346 346 0 488 488 488 433 350 0
我的代码如下:
#include <iostream>
using namespace std;
int main(int argc, char** argv)
int n;
int a[100000],b[100000];
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
if(a[i]>a[i-1])
b[i]=0;
else
b[i]=a[i-1];
b[0]=0;
for(int i=0;i<n;i++)
cout<<b[i]<<" ";
我的代码输出:0 455 346 0 0 488 0 0 433 350 0
预期:0 455 346 346 0 488 488 488 433 350 0
我在这里无法找出问题所在,请建议如何优化代码。
【问题讨论】:
我建议您花点时间阅读 Eric Lippert 的 How to debug small programs。 我不明白您的问题(您要解决的任务)。还不够清楚…… 请edit你的问题告诉我们你做了什么样的调试。我希望您已经在 Valgrind 或类似的检查器中运行了您的minimal reproducible example,并使用诸如 GDB 之类的调试器进行了调查。确保您也启用了全套编译器警告。这些工具告诉了你什么,它们缺少什么信息?并阅读 Eric Lippert 的 How to debug small programs。 【参考方案1】:方法-
-
使用堆栈以升序跟踪先前较大的元素。
从左到右扫描每个元素arr[i]
,不断从堆栈中弹出,直到堆栈的顶部元素大于当前数字
我。如果堆栈为空,则左侧没有比当前更大的数字。打印 0
二。否则打印堆栈的顶部元素,它是前一个更大的数字。
将当前元素压入栈中。
代码:
void immediatePreviousLarger(int arr[], int n)
stack<int> Stack;
for(int i = 0; i < n; i++)
while(!Stack.empty() and Stack.top() <= arr[i])
Stack.pop();
if(Stack.empty())
printf("0 ");
else
printf("%d ", Stack.top());
Stack.push(arr[i]);
时间复杂度O(n)
。
【讨论】:
“使用堆栈”不,完全不需要。 我没有提到堆栈是强制性的。这是让他的解决方案得到接受并避免超出时间限制的方法之一。 谢谢你!除了使用时间复杂度为 O(n) 的堆栈之外,您能否建议我用其他方法来解决这个问题。 不客气!很不幸的是,不行!但我认为您需要一些具有 LIFO 属性的数据结构,例如堆栈,否则时间复杂度将难以保持 O(n)。以上是关于前一个较大数字代码中的输出不正确的主要内容,如果未能解决你的问题,请参考以下文章