2016-10-04 169 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

相關問題