難易度:易
題目:判斷一個(gè)整數(shù)是否是回文數(shù)?;匚臄?shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù)。
特別說明:LeetCode上此題認(rèn)為-123 倒過來是123-不是回文數(shù),我感覺因?yàn)椴皇亲址?,有待商榷,那我們就不考慮負(fù)數(shù)的情況。
思路:
1:如果是正整數(shù)不考慮字符串的情況下,那我們應(yīng)該會想到把正整數(shù)反轉(zhuǎn)輸出對比原數(shù)據(jù),如果相等就是回文數(shù),關(guān)于數(shù)字反轉(zhuǎn),請參考我的iOS算法系列(一)--數(shù)字反轉(zhuǎn)。
2:如果我們在考慮優(yōu)化的話,那我們只需要反轉(zhuǎn)一半的數(shù)字即可,比如:456654,我們反轉(zhuǎn)后三位得到456,剩下的三位為456。即可得到次數(shù)為回文數(shù)。
3:那如何判斷正好反轉(zhuǎn)了一半呢,就用反轉(zhuǎn)的后的數(shù)字10和剩下未反轉(zhuǎn)的數(shù)字進(jìn)行大小比較,如果大于剩下的那就是反轉(zhuǎn)一半了,比如1221,第一次反轉(zhuǎn)得到的數(shù)字為1,那么110=10, 10<122,繼續(xù)反轉(zhuǎn),12*10 = 120, 120 >12,那么代表已經(jīng)轉(zhuǎn)了一半。
3:那上面考慮的是偶數(shù)位的情況,如果是奇數(shù)位的話,也可以使用。
4:最后因?yàn)槲覀儾恢赖降资瞧鏀?shù)位還是偶數(shù)位,我們需要用一個(gè)或狀態(tài)來返回兩種可能的情況
代碼如下,已經(jīng)下Xcode上編譯運(yùn)行,并輸出正確結(jié)果
-(BOOL)isPalindrome:(NSInteger)paraInt
{
//小于10不是回文數(shù)
if (paraInt <= 10)
{
return NO;
}
//我們拿反轉(zhuǎn)數(shù)求模剩余的數(shù)字進(jìn)行比較,反轉(zhuǎn)一半的數(shù)就可以,如果是奇數(shù)的話,我們只需要把他去除掉即可
NSInteger temp = 0;
while (temp * 10 < paraInt)
{
temp = paraInt % 10 + temp * 10;
paraInt /= 10;
}
return temp == paraInt || temp/10 == paraInt;
}