2013-05-19 63 views
2

我試圖從SPOJ解決問題。但對我來說問題並不在於算法的實際難度;這是我的Java代碼的性能,因爲它通常會導致超時錯誤的時間限制。我聽說Java比C/C++在競賽問題上的表現慢,這是臭名昭着的;但是,我現在可以編寫的唯一語言是Java。因此,我在尋求建議,使我的代碼更加整潔,速度更快。以下是我的解決方案和源代碼問題。需要固定我的Java代碼

public class NextPalindrome { 

public static BigInteger secondHalf(BigInteger b) { 
    String s = b.toString(); 
    int n = s.length(); 
    if(n==1){ 
     return b; 
    } 
    String end = s.substring((n + 1)/2, n); 
    BigInteger End = new BigInteger(end); 
    return End; 
} 

public static BigInteger reverse(BigInteger b) { 
    String s = b.toString(); 
    int n = s.length(); 
    String beg = b.toString(); 
    String reversebeg = ""; 
    while (true) { 
     for (int i = n - 1; i >= 0; i--) { 
      reversebeg = reversebeg + beg.charAt(i); 
     } 
     break; 
    } 
    BigInteger reverse = new BigInteger(reversebeg); 

    return reverse; 
} 

public static BigInteger firstHalf(BigInteger b) { 
    String s = b.toString(); 
    int n = s.length(); 
    if(n==1){ 
     return b; 
    } 
    String beg = s.substring(0, n/2); 
    BigInteger Beg = new BigInteger(beg); 
    return Beg; 
} 

public static BigInteger nextPalindrom(BigInteger b) { 

    String s = b.toString(); 

    int n = s.length(); 
    if(n==1){ 
     if(b.equals(9)){ 
      return BigInteger.valueOf(11); 
     } else { 
      return b.add(BigInteger.valueOf(1)); 
     } 
    } 
    if (n % 2 == 1&&n>1) { 
     Character c = s.charAt(n/2); 
     String C = c.toString(); 
     BigInteger med = new BigInteger(C); 
     BigInteger beg = firstHalf(b); 

     BigInteger end = secondHalf(b); 

     if (reverse(beg).compareTo(end) <= 0) { 
      beg.add(BigInteger.valueOf(1)); 
      if (med.compareTo(BigInteger.valueOf(9)) == 0) { 
       c = '0'; 
      } else { 
       med = med.add(BigInteger.valueOf(1)); 
      } 
     } 
     String temp = beg.toString(); 
     String temp1 = reverse(beg).toString(); 
     C = med.toString(); 
     String result = temp + C; 
     result = result.concat(temp1); 
     BigInteger B = new BigInteger(result); 

     return B; 
    } 
    BigInteger beg = firstHalf(b); 

    BigInteger end = secondHalf(b); 

    if (reverse(beg).compareTo(end) <= 0) { 
     beg = beg.add(BigInteger.valueOf(1)); 

    } 
    String temp = beg.toString(); 
    String temp1 = reverse(beg).toString(); 

    String result = temp.concat(temp1); 
    BigInteger B = new BigInteger(result); 
    return B; 

} 

public static void main(String[] args)throws IOException { 

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
    String s = in.readLine(); 
    int N = Integer.parseInt(s); 
    for (int i = 0; i < N; i++) { 
     BigInteger big = new BigInteger(in.readLine()); 
     BigInteger palindrom = nextPalindrom(big); 
     System.out.println(palindrom); 
    } 

} 
} 
+0

你的問題更適合這個網站的概念:http://codereview.stackexchange.com – Mik378

+0

我會開始不把數字轉換成字符串。 – Blender

+0

@Blender我沒有把字符串變成數字。 –

回答

0

BigInteger用於精確計算,但它是慢的。 int或long在這裏會更好。

然後有很多來自String的轉換,它們也很慢。

而且有些慢字符串操作...

因此,我建議使用整型或長 的int或長 和靜態輔助方法來操縱數字的原始位。

這應該會導致程序的最佳性能。

+0

這些數字最多可以有'1000000'數字,對於'long'沒有好處。 –

0

如果不對你的代碼發表評論,那麼你不應該相信你聽到的有關Java性能低下的一切。你將不得不努力想出一個算法來解決競爭問題,這個問題可能會在C++的時間限制下運行,但不能在Java中運行。這是你選擇算法,而不是Java,這是造成緩慢。

+0

我會牢記這一點。我很抱歉,如果我對我只是隱約知道的問題一無所知。 –