每日一题#02
題目
判斷一個(gè)整數(shù)是否是回文數(shù)。回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù)。
示例 1: 輸入: 121 輸出: true示例 2: 輸入: -121 輸出: false 解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個(gè)回文數(shù)。//c++
class Solution { public:bool isPalindrome(int x) {if(x < 0)
return false;int last = 0;int head = 0;int count = 1000000000;while( count > 1 && x / count < 1)count /= 10;while( count > 0) {last = x % 10; // 最后一個(gè)數(shù)值head = x / count; // 首個(gè)數(shù)值if(last != head)return false;x = (x - last - (head * count)) / 10;count /= 100;}return true;} };
算法:
個(gè)人想法:數(shù)字的首尾分別進(jìn)行判斷,首先用count計(jì)算出x占多少位(int型足夠大),x%10得到末尾,x/count算出首位,進(jìn)行循環(huán)? x = (x - last - (head * count)) / 10;
?
class Solution { public:bool isPalindrome(int x) {if(x<0|| (x % 10 == 0 && x != 0)) return false ;if(x/10==0) return true;int left=x ;int right=0;int nums=0;if(x<0)return false;while(left>right){right=right*10+left%10;left/=10;}if(right/left>=10) right=right/10;//如果為奇數(shù)if(left==right){return true;}else return false;return 0;} };?
官網(wǎng)解析:為了避免算法溢出,采取反轉(zhuǎn)一半,例如1221,將后兩位21反轉(zhuǎn)(12)與前兩位12進(jìn)行比較,相同即為回文數(shù)。首先想到的是,當(dāng)數(shù)字小于0時(shí),不可能為回文數(shù),首先進(jìn)行排除??if(x<0) return false;? 現(xiàn)在,讓我們來考慮如何反轉(zhuǎn)后半部分的數(shù)字。 對(duì)于數(shù)字?1221,如果執(zhí)行?1221 % 10,我們將得到最后一位數(shù)字?1,要得到倒數(shù)第二位數(shù)字,我們可以先通過除以 10 把最后一位數(shù)字從?1221?中移除,1221 / 10 = 122,再求出上一步結(jié)果除以10的余數(shù),122 % 10 = 2,就可以得到倒數(shù)第二位數(shù)字。如果我們把最后一位數(shù)字乘以10,再加上倒數(shù)第二位數(shù)字,1 * 10 + 2 = 12,就得到了我們想要的反轉(zhuǎn)后的數(shù)字。 如果繼續(xù)這個(gè)過程,我們將得到更多位數(shù)的反轉(zhuǎn)數(shù)字。我們將原始數(shù)字除以 10,然后給反轉(zhuǎn)后的數(shù)字乘上 10,所以,當(dāng)原始數(shù)字小于反轉(zhuǎn)后的數(shù)字時(shí),就意味著我們已經(jīng)處理了一半位數(shù)的數(shù)字。即可得到一個(gè)循環(huán)算法。
?來源:https://leetcode-cn.com/problems/palindrome-number/
轉(zhuǎn)載于:https://www.cnblogs.com/shineko/p/10627869.html
總結(jié)
- 上一篇: 简易promise的实现(二)
- 下一篇: 云笔记项目-Spring事务学习-传播M