009 - 回文数(palindrome-number)
/*
* @Author: lvjingshuai
* @Date: 2019-07-14 15:29:55
* @Last Modified by: lvjingshuai
* @Last Modified time: 2019-08-08 12:22:56
*/
文章结构 |
---|
1、题目介绍 |
2、解题 |
2.1 解法 - 转字符串 |
2.2 解法 - 数学算法 |
1、题目介绍
- 难度:简单 (系统学习算法与数据结构)
- 涉及知识:数学、字符串
- 题目编号:009
- 题目地址:https://leetcode-cn.com/problems/palindrome-number/
- 题目内容:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
2、解题
2.1 解法 - 转字符串
解题思路:
将数字转为字符串来判断,是比较简单的一种方法:
-
将数字转成字符串。
-
循环遍历。
-
按对称判断第
i
位和第length - (i + 1)
位是否相等。
解题:
const isPalindrome = function(x) {
const str = String(x);
let isPalind = true;
for (let i = 0; i < str.length / 2; i++) {
if (str[i] !== str[str.length - (i + 1)]) {
isPalind = false;
break;
}
}
return isPalind;
};
测试:
- 输入:
121
- 输出:
true
- [测试结果](https://leetcode-cn.com/submissions/detail/25086305/)
知识点:
break
:跳出for循环。
2.2 解法 - 数学算法
解题思路:
-
我们可以想象:当一个数的长度为偶数,那么它对折过来应该是相等的;当一个数的长度是奇数,那么它对折过来后,有一个的长度需要去掉一位数(除以 10 并取整),因为奇数长度的那个数,我们不需要判断它中间的数字。
-
获取数的末位数取余操作 :
原数 % 10
,将一个数添加到数的末尾:原数* 10 + 添加的末位数
,例如:把2
添加到1的末尾1 * 10 + 2 = 12
。
解题代码:
const isPalindrome = function(x) {
if(x < 0 || (x % 10 == 0 && x != 0)) {
// 小于0 末尾为 0 就可以直接返回 false
return false;
}
let revertedNumber = 0;
while(x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x = Math.floor(x / 10);
}
// 判断奇偶数情况:如果是偶数的话,revertNum 和 x 相等;如果是奇数的话,最中间的数字就在revertNum 的最低位上,将它除以 10 以后应该和 x 相等。
return x === revertedNumber || x === Math.floor(revertedNumber / 10);
};
测试:
- 输入:
121
- 输出:
true
- [测试结果](https://leetcode-cn.com/submissions/detail/25089697/)