3 回答

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
我敢打賭第二種算法會(huì)更快,而且顯然更節(jié)省空間。如果您假設(shè)n是輸入數(shù)字的位數(shù),則在第一個(gè)算法中:
Integer.toString
需要n 個(gè)步驟才能將其轉(zhuǎn)換為String
.palindromeCheck
需要n / 2 次比較來(lái)檢查它是否是回文。
但是,第二種算法需要n 個(gè)步驟來(lái)計(jì)算倒數(shù)(僅涉及整數(shù)運(yùn)算)并且只需要 1 個(gè)比較來(lái)檢查。

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
我們?cè)囋嚢?。在以下示例中(使用一個(gè)特定數(shù)字,在我的特定機(jī)器上......):
580 毫秒 - 您的第一個(gè)解決方案
323 毫秒 - 您的第二個(gè)解決方案
1045 毫秒 - BrentR 的解決方案
注意我修改了代碼(但不是邏輯)。您還應(yīng)該注意空格和縮進(jìn)。
public class Palindrome {
public static boolean isPalindrome1(int n) {
char a[] = Integer.toString(n).toCharArray();
int i = 0;
int j = a.length - 1;
while (i < j) {
if (a[i++] != a[j--]) return false;
}
return true;
}
public static boolean isPalindrome2(int n) {
int p = n, q = 0;
while (n > 0) {
q = 10 * q + n % 10;
n /= 10;
}
return p == q;
}
public static boolean isPalindrome3(int n) {
String s = Integer.toString(n);
return s.equalsIgnoreCase(new StringBuilder(s).reverse().toString());
}
public static void main(String[] args) {
final int m = 10000000;
long t1, t2;
boolean q;
t1 = System.currentTimeMillis();
for (int n = 0; n < m; n++) {
q = isPalindrome1(123454321);
}
t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
t1 = System.currentTimeMillis();
for (int n = 0; n < m; n++) {
q = isPalindrome2(123454321);
}
t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
t1 = System.currentTimeMillis();
for (int n = 0; n < m; n++) {
q = isPalindrome3(123454321);
}
t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
}
}

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊
你為什么要重新發(fā)明輪子?
java.lang.StringBuilder 已經(jīng)提供了字符串反轉(zhuǎn)方法
String string = Integer.toString(10101);
boolean palindrome = string.equalsIgnoreCase(new StringBuilder(string).reverse().toString());
添加回答
舉報(bào)