[英]Need to fasten my Java code
我正在嘗試解決SPOJ的問題。 但是對我來說,問題不在於算法的實際難度。 這是我的Java代碼的性能,因為它通常會導致時間限制超出錯誤。
我聽說Java與C / C ++相比,在競賽問題上表現較差而臭名昭著。 但是,我現在唯一可以使用的語言是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);
}
}
}
BigInteger用於精確計算,但是它很慢。 int或long在這里會更好。
然后,有很多往返於String的轉換,這也很慢。
還有一些慢速的String操作...
因此,我建議使用int或long以及Integer或Long的靜態輔助方法來處理數字的原始位。
那應該導致程序的最佳性能。
如果不評論別人所提到的代碼,就不應相信聽到的有關Java性能低下的所有信息。 您將不得不非常想一想解決競爭問題的算法,該算法將在C ++的時間限制內運行,而在Java中則不會。 導致速度緩慢的原因是您選擇算法而不是Java。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.