📜  删除 TLE 的方法

📅  最后修改于: 2021-10-19 04:54:53             🧑  作者: Mango

在任何在线裁判上解决问题时,有时可能会超出时间限制。下面是一些优化代码的方法:

  • 尽量减少循环内循环的使用,嵌套循环例如:
for(i = 0 ; i < n ; i++)
     {
           for(j = 0 ; j < n ; j++)
           {
                // Your Code
           }
      }

上面的代码将执行N*N次迭代并需要更多时间,为了避免这种情况,想法是考虑一种方法,最大限度地减少循环内循环的使用。

  • 不要喜欢长长的if-else,而是喜欢使用Switch 语句例如:
if(condition 1)
{

}
else
{
   if(condition 2)
   {

   }
   else
   {
   
   }
}

假设有另一个条件3,则码流是首先检查条件1,条件2则它将达到条件3。因此,它需要3次操作。这个想法是使用下面的代码:

switch (c)
{
    // Condition 1
    case 1:
       break;

    // Condition 2
    case 2 :
       break;

       // And so on
}

在 switch case 中,编译器会直接跳转到条件并执行它们,而不执行其他条件。

  • 与其使用“i = i + 1” ,不如使用“++i” ,而不是“i = i + 3” ,而使用“i +=3”
  • 更好地选择前递增或前递减而不是后递增和后递减,直到并且除非需要。例如:
int i = 3;

// It will increment in the same step
++i;

// It will increment in the next step
// so it will take more time
i++;
  • 也应该避免使用指针,哪里可以避免。一个指针指向一个变量的地址,该地址将进一步用于访问该变量。所以尽量直接访问变量,因为它们可以直接使用,因此可以减少时间。
  • 使用 StringBuilder 或 StringBuffer 类代替“+”运算符进行连接
1.Using "+" operator
        String x="";
        char c='a';
        for(int i=0;i<10000;i++)
          x+=c;
          
        2.Using StringBulider/StringBuffer Class
        StringBuilder sb=new StringBuilder("");
        char c='a';
        for(int i=0;i<10000;i++)
         sb.apppend(c);
        String x=sb.toString();

他们都做同样的工作(制作 10000 个 ‘a’字符副本的字符串)。但是第二个选项比第一个选项花费的时间少 10 倍。

因此,始终建议使用 StringBuilder(在Java)而不是“+”运算符进行连接。