您的程序花费了比预期更多的时间。超过了时间限制。预期时限<3.496sec

时间:2019-08-22 07:33:35

标签: c#

Here是我的代码链接。 当我提交代码here时,它显示:

Your program took more time than expected.Time Limit Exceeded 
Expected Time Limit < 3.496sec 
Hint : Please optimize your code and submit again. 

为什么发生Time Limit Exceeded?我该如何解决这个问题?

当我运行代码here时,一切正常。但是,当我单击Submit按钮here时,则显示以下错误:

Your program took more time than expected.Time Limit Exceeded 
Expected Time Limit < 3.496sec 
Hint : Please optimize your code and submit again.

谢谢。

我的代码是

        int testCases = int.Parse(Console.ReadLine().Trim());

        while (testCases-- > 0)
        {
            int arrSize = int.Parse(Console.ReadLine().Trim());
            string[] arr = Console.ReadLine().Trim().Split(' ');

            for (int i = 0; i < arrSize - 1; i++)
            {
                if (int.Parse(arr[i]) > int.Parse(arr[i + 1]))
                {
                    Console.Write(arr[i + 1] + " ");
                }
                else
                    Console.Write("-1" + " ");
            }
            Console.Write("-1");
            Console.WriteLine();
        }

1 个答案:

答案 0 :(得分:3)

简单的答案是您的代码太慢。为什么这很重要?

  • 您正在其他人的服务器上运行代码,因此您可以执行的操作受到限制。轻度浪费服务器资源会使其他所有人的体验变差,并增加主机成本。
  • 您正在执行编程练习,以测试您编写正确的高性能代码的能力。时间限制是您应该解决的问题的一部分:)

请注意问题中定义的约束:

  

1≤T≤200

     

1≤N≤10E7

     

1≤arr [i]≤1000

每个数组的长度最多可以达到1000万个元素。大量的int解析和字符串连接,大量的分配等。

您可以尝试改进什么代码?

  • 避免两次解析相同的数字-您总是将数组的每个元素解析两次,这是不必要的开销。
  • 尝试使用StringBuilder构建输出字符串,而不是单独的Console.Write调用;通过单个StringBuilder调用来编写整个Console.WriteLine,并清除StringBuilder供下次迭代使用(避免一遍又一遍地分配另一个大字符串)。
  • 您可以编写自己的整数解析器,而不用使用Splitint.Parse,而该整数解析器可以逐个字符地读取输入数据,而不必始终创建新的字符串。您拥有的输入数据受到很好的约束,因此编写解析器几乎是微不足道的。
  • 根据执行环境的不同,可能值得在不使用中间字符串的情况下直接将数据从输入流传输到输出(这基本上与第2点相反)。理想情况下,在缓冲输入和输出时,您不必必须处理太大的字符串(同样,请记住数组可以包含一千万个元素,这是一个很长的字符串!)。

祝您完成挑战充满好运! :)