下面要分享的是一道来自leetcode(力扣)的简单算法题,让我们一起进步成长。
使用语言:JavaScript
// 9. 回文数
// 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
// 示例 1:
// 输入: 121
// 输出: true
// 示例 2:
// 输入: -121
// 输出: false
// 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
// 示例 3:
// 输入: 10
// 输出: false
// 解释: 从右向左读, 为 01 。因此它不是一个回文数。
// 进阶:
// 你能不将整数转为字符串来解决这个问题吗?
首先,这道题我尝试去使用字符串的方法去解。后来,我们发现,这道体实际上的方法和我的上一篇文章《算法之两数相加》类似。所以,我也就套用了那个方法,我先给出代码,然后,在来讲解我提取出来的方法。
代码0:
function isPalindrome0(x) {
if(x == null) return false;
if(x < 0) return false;
if(x % 10 == 0 && x != 0) return false;
x = x + '';
var reserveX = x.split("").reverse().join('');
return x == reserveX;
}
代码解释:
首先是算法严谨性判断,如果没有传入参数x,就直接返回 false;
因为负数肯定不是回文数,所以也可以直接返回 false.
因为像10, 20, 30…450…这些数肯定不是回文数,但是0 % 10 == 0,但是0 是个位数,0是回文数,所以0除外,对应像10, 20, 30…450…的数可以直接返回 false.
x = x + ‘’ 就是把x 变成一个字符串,然后在把字符串变成数组,再把数组取反,在不数组变成字符串,最终判断x字符串和reserveX字符串是不是一样的。
代码1:
// 反转全部的数:
function isPalindrome(x) {
if(x == null) return false;
if(x < 0) return false;
if(x % 10 == 0 && x != 0) return false;
var rev = 0;
var temp = x;
while(x != 0) {
var pop = x % 10;
x = Math.floor(x / 10);
rev = rev * 10 + pop;
}
return rev === temp;
}//有溢出的风险
代码2:
// 反转一半的数:
function isPalindrome1(x) {
if(x == null) return false;
if(x < 0) return false;
// 如果数字的最后一位是 0,为了使该数字为回文
if(x % 10 == 0 && x != 0) return false;
var rev = 0;
while(x > rev) {
var pop = x % 10;
rev = rev * 10 + pop;
x = Math.floor(x / 10);
}
return x == rev || x == Math.floor(rev / 10);
//下面是解释为什么要返回x == rev || x == Math.floor(rev / 10)
//整数中数的个数是偶数个:
// 1221 0
// 122 1
// 12 12
//整数中数的个数是奇数个:
// 121 0
// 12 1
// 1 12
}
好了,下面我们来讲一下,我从从提取到的方法:
就是对整数进行像数组那样的pop 和 push操作:
代码如下:
var num = 12546;
// pop操作:
var pop = num % 10;
num = ~~ (num / 10);
console.log(num); // 1254
// push操作:
num = num * 10 + pop;
console.log(num); // 12546
其中的 ~~是双非按位取反运算符可以看作是Math.floor() 和 Math.ceil() 这两个函数功能的集合,而且运行速度比这两个函数快,有兴趣可以自行百度一下。
~~简单的说,就是把一个数(整数或者是非整数)经过两次按位取反,最后得到一个整数。具体内容,还是得读者自己去了解。
本次就分享回文数这道简单的算法题,以后还会分享更多算法题,请大家关注。
我们一起成长,一起进步。
本文章如果有侵权行为,请及时与我联系,谢谢。