>[success] # 回文数
~~~
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
注意
负数不是回文数
~~~
>[danger] ##### python解题
* 思路
~~~
1.121 发现规律,每一个字符串收尾一致就是回文数
2.利用数字长度的一半循环,则左侧项都为i,右侧项都为len-1-i
~~~
* 个人解法
~~~
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x<0:
return False
else:
x = str(x)
if x==0:
return True
for i in range(0,int(len(x)/2)):
if x[i]!=x[len(x)-i-1]:
return False
return True
~~~
* 优秀解法
~~~
1.任何数的余数10,是这个数的末尾数 例如 121%10 =1
2.数字 前半段 和 数字 后半段的数一致 为 回文数 例如 11211 也就是11=11
注:
注释一:结尾是0的数绝对不是回文数,但是0是回文数
注释二:例如121 x最后会变成1 而revertedNumber 变成12, 6556 x最后变成56 revertedNumber 变成56,
6565 x最后 变成6 revertedNumber565,如果是奇数个数 或者是偶数非回文函数的数,会多执行一次,来终止循环
如果是偶数的回文函数,就会正好前后一致终止循环
注释三:面对非回文数,和奇数回文数会比,实际多一个中位数,中位数是最后一位,去掉末尾中位数,去比较实际两者是否一致
~~~
~~~
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
# 注释一
if (x<0 or (x%10 == 0 and x!=0)):
return False
else:
revertedNumber = 0
# 注释二
while x> revertedNumber:
revertedNumber = revertedNumber*10 + x%10
x = x//10
# 注释三
return x == revertedNumber or x == revertedNumber//10
~~~
* python 解法
~~~
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x < 0:
return False
else:
return int(str(x)[::-1]) == x
~~~
* js 最快解法
![](https://box.kancloud.cn/2f3df7cfab52c6d963cf35f6fe827371_859x504.png)
>[danger] ##### js解题
* 最常见的方法,循环当前长度的一半,用首尾值依次比较
~~~
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if(x<0) return false
if(x===0) return true
var x = x.toString()
for(var i =0;i<parseInt(x.length/2);i++){
if(x[i]!=x[x.length-i-1]) return false
}
return true
};
~~~
* 跟第一种思路一样实现不同
~~~
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if(x<0) return false
var s = x.toString()
var i =0 ,j=s.length-1
while(i<=j){
if(s[i]==s[j]){
i++
j--
}else{
return false
}
}
return true
};
~~~
* 利用反转整数的思想去比较
~~~
var isPalindrome = function(x) {
if(x<0||x%10===0 &&x!=0){
return false
}
return x.toString().split('').reverse().join("") == x
};
~~~
* 最快解法[关于trunc方法说明]([https://blog.csdn.net/qq\_37016928/article/details/80667247](https://blog.csdn.net/qq_37016928/article/details/80667247))
~~~
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x < 0) {
return false;
}
let len = 1;
while (x / len > 10) {
len *= 10;
}
while (x > 0) {
let left = Math.trunc(x / len);
let right = x % 10;
if (left !== right) {
return false;
} else {
x = Math.trunc((x % len) / 10);
len /= 100;
}
}
return true;
};
~~~
- 接触数据结构和算法
- 数据结构与算法 -- 大O复杂度表示法
- 数据结构与算法 -- 时间复杂度分析
- 最好、最坏、平均、均摊时间复杂度
- 基础数据结构和算法
- 线性表和非线性表
- 结构 -- 数组
- JS -- 数组
- 结构 -- 栈
- JS -- 栈
- JS -- 栈有效圆括号
- JS -- 汉诺塔
- 结构 -- 队列
- JS -- 队列
- JS -- 双端队列
- JS -- 循环队列
- 结构 -- 链表
- JS -- 链表
- JS -- 双向链表
- JS -- 循环链表
- JS -- 有序链表
- 结构 -- JS 字典
- 结构 -- 散列表
- 结构 -- js 散列表
- 结构 -- js分离链表
- 结构 -- js开放寻址法
- 结构 -- 递归
- 结构 -- js递归经典问题
- 结构 -- 树
- 结构 -- js 二搜索树
- 结构 -- 红黑树
- 结构 -- 堆
- 结构 -- js 堆
- 结构 -- js 堆排序
- 结构 -- 排序
- js -- 冒泡排序
- js -- 选择排序
- js -- 插入排序
- js -- 归并排序
- js -- 快速排序
- js -- 计数排序
- js -- 桶排序
- js -- 基数排序
- 结构 -- 算法
- 搜索算法
- 二分搜索
- 内插搜索
- 随机算法
- 简单
- 第一题 两数之和
- 第七题 反转整数
- 第九题 回文数
- 第十三题 罗马数字转整数
- 常见一些需求
- 把原始 list 转换成树形结构