第9題:回文數(shù)
判斷一個整數(shù)是否是回文數(shù)寸莫≌回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù)栖雾。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 看铆。因此它不是一個回文數(shù)挤巡。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 剩彬。因此它不是一個回文數(shù)。
進(jìn)階:
你能不將整數(shù)轉(zhuǎn)為字符串來解決這個問題嗎矿卑?
V1版本
這題一看就知道最少兩種解法襟衰,先用第一種解法試試水,轉(zhuǎn)成string然后進(jìn)行對比
首先要知道的是
1.負(fù)數(shù)肯定不是回文數(shù)
2.個位數(shù)肯定是回文數(shù)
代碼如下
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
} else if (x < 10) {
return true;
}
String xStr = String.valueOf(x);
int lentgh = xStr.length() - 1;
// 比較兩頭的數(shù)是否相同
for (int i = 0; i <= lentgh/2; i++) {
if (xStr.charAt(i) != xStr.charAt(lentgh - i)) {
return false;
}
}
return true;
}
代碼雖然簡單易懂粪摘,不過執(zhí)行效率也是不出所料的
V2版本
V1版本將數(shù)字轉(zhuǎn)成字符本身就需要額外的空間瀑晒,V2版本按要求進(jìn)階
既然是回文數(shù),那么右邊翻轉(zhuǎn)過來肯定和左邊不是一樣的徘意,同時需要考慮數(shù)字的長度是奇數(shù)位的情況
代碼如下
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
} else if (x < 10) {
return true;
} else if (x % 10 == 0) {
// 開始反轉(zhuǎn)時苔悦,發(fā)現(xiàn)遇到10,20的時候處理不對椎咧,后面發(fā)現(xiàn)這種數(shù)都不是回文串玖详,直接先排除
return false;
}
// 用于記錄翻轉(zhuǎn)的值
int num = 0;
while (x > num) {
num = num * 10 + x % 10;
x /= 10;
}
/**
* 例:1221
* 翻轉(zhuǎn)后x=12,num=12,成功
* 例:121
* 翻轉(zhuǎn)后x=1,num=12,因為數(shù)的長度是奇數(shù)位,num需要去掉中間的2才能匹配
*/
return num == x || num/10 == x;
}
執(zhí)行結(jié)果和上面一樣勤讽,效率并沒有提到提升蟋座,去找找官方的實現(xiàn)思想看看
V3版本
看了一下官方的版本,主要是提前判斷那里不一樣
官文的是
// 特殊情況:
// 如上所述脚牍,當(dāng) x < 0 時向臀,x 不是回文數(shù)。
// 同樣地诸狭,如果數(shù)字的最后一位是 0券膀,為了使該數(shù)字為回文,
// 則其第一位數(shù)字也應(yīng)該是 0
// 只有 0 滿足這一屬性
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
發(fā)現(xiàn)我的判斷改成官方的這種方式驯遇,時間也能得到提升芹彬,一個判斷竟然差距這么大
看到精選里還有一種數(shù)學(xué)解法
不過這種解法效率感覺更差一點,就沒去實現(xiàn)叉庐,多了解一中思路而已