2016-10-04 174 views
3

我试图弗吉尼亚问题数量10324 和我编写了以下解决方案这个被公认的,但给人的2.670秒 真的糟糕的运行时我有以下两个代码 这是我的代码速度在Java中,为什么有些代码的运行速度

public static void main(String[] args) throws Exception{ 
     // write your code here 
     StringBuilder op = new StringBuilder(); 
      InputStreamReader isr = new InputStreamReader(System.in); 
      BufferedReader reader = new BufferedReader(isr); 
      String input, tmp[]; 
      int n, l, u, j, i = 0; 
      boolean dec; 
      char thi; 
      while ((input = reader.readLine()) != null) { 
       op.append("Case " + (++i) + ":\n"); 
       n = Integer.parseInt(reader.readLine()); 
       while (n-- > 0) { 
        tmp = reader.readLine().split(" "); 
        l = Integer.parseInt(tmp[0]); 
        u = Integer.parseInt(tmp[1]); 
        if (l > u) { 
         l ^= u; 
         u ^= l; 
         l ^= u; 
        } 
        //System.out.println(l + "|" + u); 
        dec = true; 
        thi = input.charAt(l++); 
        for (; l <= u; l++) { 
         if (thi != input.charAt(l)||(thi != input.charAt(u--))) { 
          dec = false; 
          break; 
         } 
        } 
        op.append((dec ? "Yes\n" : "No\n")); 
       } 
      } 
      System.out.print(op.toString()); 
      return; 

    } 
} 

和其他代码是一个我发现离Mr Gorgon's Solution 这有0.84秒

一个 运行210
public static void main(String[] args) throws Exception { 
    InputStreamReader isr = new InputStreamReader(System.in); 
    BufferedReader br = new BufferedReader(isr); 
    StringBuilder sb = new StringBuilder(""); 
    int testCase = 1; 
    String line; 
    while ((line = br.readLine()) != null) { 
     sb.append("Case ").append(testCase).append(":\n"); 
     testCase++; 
     int noOfCases = Integer.parseInt(br.readLine()); 
     for (int j = 0; j < noOfCases; j++) { 
      String[] str = br.readLine().split(" "); 
      int val1 = Integer.parseInt(str[0]); 
      int val2 = Integer.parseInt(str[1]); 
      if (val1 > val2) { 
       val1 ^= val2; 
       val2 ^= val1; 
       val1 ^= val2; 
      } 
      boolean isValid = true; 
      if (val1 != val2) { 
       for (int i = val1; i < val2; i++) { 
        if (line.charAt(i) != line.charAt(i + 1)) { 
         isValid = false; 
         break; 
        } 
       } 
      } 
      if (isValid) 
       sb.append("Yes\n"); 
      else 
       sb.append("No\n"); 
     } 
    } 
    System.out.print(sb); 
} 

我发现它为什么这个代码运行如此之快,当所有任务基本上same.and我的代码比蛇发女妖代码较小的声明非常难以理解为

+0

声明ns实际上并没有真正增加很多性能开销(并且我没有看到你真的有任何声明更少...) –

+0

我创建了一些测试用例,其中包含几个非常长的字符串和很多较短的字符串,并在本地运行了两个版本(windows和linux,jdk8),而且你的版本快了大约2倍。知道他们(UVA)的实际测试用例和他们正在使用的Java运行时会很有趣。 – starikoff

回答

2
  • op.append("Case " + (++i) + ":\n");

这否定的StringBuilder

  • if (val1 != val2) {的好处在第二个版本的快捷方式循环
+0

你的第二点是无效的。如果两个值相同,则OP的循环条件也不会进入循环。 –

+1

没有试过让变化仍然在同一时间 –

+0

第一点也是无效的。 – starikoff

-1

您的解决方案中缺少一段代码。你正在盲目循环,好像条件限制循环一样。

if (val1 != val2) { 
            } 
      } 
2

input.charAt(l)!=input.charAt(l+1) 

线,这有助于加快程序,我认为它做缓存

我研究,发现一种叫JCS 这可能使他们Apache服务器,以缓解内存数据,并帮助更快访问

+2

JCS与此无关,但您确定这条线是使代码运行速度明显快于您的版本的原因 – starikoff

相关问题