访问https://www.interviewbit.com/problems/largest-number/来解决问题...
现在,我编写了以下代码来解决该问题(尽管我使用数组来存储数字,但稍后将在字符串中进行存储..)-
因此,在该算法中,我基本上使用了快速排序,但有一个转折,我更改了大于或小于两个数字的定义,例如X,Y,使得如果使用X首先,Y其次或XY形成的数字是> = YX然后大于(X,Y)为真
在当前情况下,代码给出了运行时错误,我不明白为什么,而且在注释中所示的一些调试之后,仍然没有按预期来得到答案。
#include <iostream>
#include <vector>
#include <cmath>
#include <stdlib.h>
#include <time.h>
using namespace std ;
bool greaterthan(int a,int b)
{
int n1,n2,s1,s2;
n1=((int )log10(a))+1;
n2=((int)log10(b))+1;
s1=a*((int )pow(10,n2))+b;
s2=a + ((int )pow(10,n1))*b;
if(s1>=s2){return true;}
else{return false;}
}
int spartitions(vector<int >&B,int s , int e)
{
int pivot = B[e];
int pin =s;
int i;
for(i=s;i<=e;i++) //if i change this to i<e
{
if(B[pin]>=pivot)
{swap(B[pin],B[i]);
pin++;
}
// and add swap(B[pin],B[e]);
}
return pin-1; // and return pin here then it works but not give correct output
}
int prand(vector<int >&B,int s ,int e)
{
srand(time(NULL));
int n = rand()%(e-s+1)+s;
swap(B[n],B[e]);
int pin = spartitions(B,s,e);
return pin;
}
void qsort(vector<int >&B,int s, int e )
{
if(s<e){
int p= prand(B,s,e);
qsort(B,s,p-1);
qsort(B,p+1,e);
}
}
vector<int> largestnumber(vector<int >&A)
{
int n =A.size();
vector<int >B(n);
B=A;
qsort(B,0,n-1);
return B;
}
int main()
{
int n;
cin>>n;
vector<int>A(n);
int i;
for(i=0;i<n;i++)
{
cin>>A[i];
}
vector<int >B(n);
B=largestnumber(A);
for(i=0;i<n;i++)
{
cout<<B[i];
}
}
请帮助,因为我是编程方面的新手,大约3-4小时后仍无法解决... ??
如果有人只能更正我的代码而不给出其他算法,我将不胜感激,因为我希望对此算法进行更正。
答案 0 :(得分:0)
您自己编写的qsort
函数以递归方式调用自身,这会将更多的内容添加到堆栈中,而堆栈只有这么多的空间。当列表太大时,堆栈中将有太多的函数调用,并且溢出。这就是为什么第一个输入(用于n
)小于5的任何东西都可以正常工作的原因,但是一旦超过该值,就会出现运行时错误。考虑不使用递归函数调用。
编辑: 启用优化似乎也可以解决此问题。 这可能不起作用,具体取决于编译器及其优化方式。 (适用于MSVC)