标签:10 return int rev false x1 LeetCode 回文
题目
给你一个整数 x ,如果 x 是一个回文整数,返回 ture ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
示例 4:
输入:x = -101
输出:false
提示:-231 <= x <= 231 – 1
进阶:你能不将整数转为字符串来解决这个问题吗?
解题过程
- 首先想到转换为字符串,这样就易于从中取字符一个个比较;
- 若不用字符串 :将反转后的数和原来的数比较是否一样(注意:从第7题可知,反转后的数可能会超过int的范围,所以用long存储);
bool isPalindrome(int x){
if (x < 0)
return false;
else
{
// 将反转后的整数(long)与原数作比较
long rev = 0;
int temp = x;
while (x != 0)
{
rev = rev * 10 + x % 10;
x /= 10;
}
if (rev == temp)
return true;
else
return false;
}
}
改进
官方给出了更好的方法:因为将整个数反转过来会溢出 ,所以可以只反转半个数,与前半个比较即可。问题在于如何判断何时恰好反转了一半?由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。
注意:排除临界情况:
- x < 0
- x的最低位为0但不等于0。这个方法中,不排除这个情况会使110、10等情况为true。
bool isPalindrome(int x){
if (x < 0 || (x % 10 == 0 && x != 0))
return false;
else
{
int x1 = x;
int rev = 0;
while (x1 > rev)
{
rev = rev * 10 + x1 % 10;
x1 /= 10;
}
if (rev == x1 || rev / 10 == x1)
return true;
else
return false;
}
}
标签:10,return,int,rev,false,x1,LeetCode,回文 来源: https://blog.csdn.net/m0_55019159/article/details/113408120
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。