目录
  1. 1. 回文数判断
    1. 1.1. 问题描述
    2. 1.2. 数反转比对
      1. 1.2.1. 问题分析
      2. 1.2.2. 代码实现
      3. 1.2.3. 运行结果
    3. 1.3. 数学解法
      1. 1.3.1. 问题分析
      2. 1.3.2. 代码实现
      3. 1.3.3. 运行结果
    4. 1.4. 总结
回文数判断

回文数判断

问题描述

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true
示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:

你能不将整数转为字符串来解决这个问题吗?

数反转比对

问题分析

这道题和之前的特殊回文数)有很相同的类似,不过这个不是输出,而是判断,同样是将数字进行拆分,只不过不清楚数字的准确大小长度,因此需要考虑到关于长度未知的问题,可以考虑对数的进行拆分重组新数,将新数与原数进行比较。

代码实现

class Solution {
public:
bool isPalindrome(int x) {
long y=0,xx=x;
if(x<0)
return false;
while(x){
y*=10;
y+=x%10;
x/=10;
}
if(y==xx)
return true;
else
return false;
}
};

运行结果

输入

121

输出

true

数学解法

问题分析

将数从两端向中间分别取出,做比较,若存在一组不相等,则返回false,对于奇数位的数字同样受用
示例1:
X=52425在这里插入图片描述
在这里插入图片描述
最后可以将4同时作为两边数,因此该数是一个回文数

示例2:
X=21042
在这里插入图片描述
在这里插入图片描述
此处出现拆分出来的左右数两端不相等,因此可以直接返回false

代码实现

class Solution {
public:
bool isPalindrome(int x) {
//负数直接排除
if(x<0)
return false;
int y=1;
while(x / y >= 10) //=10是为了避免10000类似的存在
y *= 10;//扩大一位,加0
while(x){
int left=x/y;//左数
int right=x%10;//右数
if(left!=right)
return false;
x = (x % y) / 10;//掐头去尾
y /= 100;//原数减去两位数,则y也缩小两位数
}
return true;

}
};

运行结果

输入

14212

输出

false

总结

同样是对数的拆分,一边是对数逐一拆分后重组,一边是对数两端同时拆分比对。相同在于对负数都有一个界限的判断。

文章作者: Jachie Xie
文章链接: https://xjc5772.github.io/2020-01/25/%E7%AE%97%E6%B3%95/LeetCode/%E5%9B%9E%E6%96%87%E6%95%B0%E5%88%A4%E6%96%AD/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XJC&Blog
打赏
  • 微信
  • 支付宝

评论