LeetCode-9-回文数
问题描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
示例 4:
输入:x = -101
输出:false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
方法一:翻转原来的数字
- Python方法
class Solution(object):
def get_reverse(self,x):
t = 0
while x!=0:
temp = x%10
t = t * 10+ temp
x = x//10
return t
def isPalindrome(self, x):
if x < 0:
return False
re = self.get_reverse(x)
if re == x:
return True
else:
return False
-
c#方法
public class Solution { private int get_reverse(int x) { int t = 0; while(x!=0) { int tmp = x%10; t = t*10 + tmp; x = x/10; } return t; } public bool IsPalindrome(int x) { if(x<0) { return false; } int re = get_reverse(x); if(re == x) { return true; } return false; } }
方法二:转化成字符串
- Python代码:
class Solution(object):
def isPalindrome(self, x):
str_x = str (x)
l = len(str_x)
i = 0
flag = True
while i <l/2:
if str_x[i] != str_x[l-1-i]:
flag = False
break
i += 1
return flag
- c#代码
public class Solution {
public bool IsPalindrome(int x)
{
string str_x = x.ToString();
bool isPal = true;
int l = str_x.Length;
for(int i=0;i<l/2;i++)
{
if(str_x[i] != str_x[l-1-i])
{
isPal = false;
break;
}
}
return isPal;
}
}
方法三:官方推荐方法
其实这个是基于方法一的优化,对一些特殊情况做了特殊处理,同时,将数字反转与判断放到了一个循环里面。
首先:小于0的一定不是回文数;
第二:个位数是0的肯定不是回文数,因为最高位肯定不会是0
-
C#方法
public class Solution { public bool IsPalindrome(int x) { if(x<0 || (x%10 == 0 && x!=0)) { return false; } int t = 0; //将x>t作为判断条件,如果x的位数时奇数位,那么循环结束后,x==t while(x>t) { t = t*10 + x%10; x = x/10; } return t==x || x==t/10; // 当x == t/10时,x的位数时偶数位,这个时候会出现t>x的情况 } }
-
Python方法
class Solution:
def isPalindrome(self, x):
if x< 0 or (x %10 ==0 and x != 0):
return False
t = 0
while x>t:
t = t*10 + x%10
x = x//10
return t==x or x==t//10
以上三个方法作对比,发现,转化成字符串的运算耗时最短