前一个较大数字代码中的输出不正确

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)。

以上是关于前一个较大数字代码中的输出不正确的主要内容,如果未能解决你的问题,请参考以下文章

使用大数字时背包没有给出正确的输出

查找给定数字的下一个较大的字谜

C - 文件的读取()错误,存储在数组中并正确打印输出

如何在数字前加上一个固定的三个字母代码?

C语言 猜数字游戏代码

冒泡排序java