我如何解决Hackerrank“终止超时”?

时间:2016-07-01 06:19:28

标签: c++ c++11

问题是在下面的测试用例下面找不到可逆的no.s,这里可逆的no.s意味着像36 + 63 = 99(包含两个奇数)。 3663都是可逆的。我们必须找到完全可逆的号码 低于数字。

我还将函数声明为inline,但它仍然给出了超时错误。测试案例#1测试案例#5

inline std::string IntToString ( int number )
    {
      std::ostringstream oss;
       oss<< number;
      return oss.str();
    }


inline int replacer (int n)

{
int r,R=0;

while(n!=0)
    {
       r=n%10 ;
    R=R*10+r ;
     n=n/10;
}

return R ;

}




int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */   

int i,n,t,j,R,Q,L,k,d=0,M=0,D; 


cin>>t ; 

for(i=0;i<t;i++ )
    {
    M=0;
    cin>>n ;

    for(j=1;j<n;j++)
        {


        if(j%10!=0)
       { d=0;
        R= replacer(j) ;

       Q=R+j ;
        std::string C = IntToString (Q);

        L=C.size() ;  


        for(k=0;k<L;k++)
           if(C[k]%2==0)
            d=1 ;
           if(d==0) 
          M++ ;
       }    
    }
    cout<<M<<endl ;
    }


return 0;
}

2 个答案:

答案 0 :(得分:0)

一个简单的通用答案就是通过让你的代码快速完成任务来解决问题。即通过优化它。

分析工具可以帮助您指出&#34; hot&#34;代码的一部分,但决议必须由你完成。

答案 1 :(得分:0)

您无需拥有字符串即可获取数字的数字。 鉴于您使用流,将int转换为字符串是一项昂贵的操作。 如果你想循环数字的数字,请使用以下代码:

void loopThroughDigits(int n)
{
    while(n > 0)
    {
        int digit = n % 10;
        n /= 10;
        //do something with digit
    }
}

除此之外,您应该考虑存储早期结果并从之前的“检查点”开始计算。我不知道内存限制或最大输入,所以我不确定这是一种可靠的方法。