算法之回文数

下面要分享的是一道来自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() 这两个函数功能的集合,而且运行速度比这两个函数快,有兴趣可以自行百度一下。

~~简单的说,就是把一个数(整数或者是非整数)经过两次按位取反,最后得到一个整数。具体内容,还是得读者自己去了解。

本次就分享回文数这道简单的算法题,以后还会分享更多算法题,请大家关注。
我们一起成长,一起进步。

本文章如果有侵权行为,请及时与我联系,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值