K先生个人博客

当前位置:首页 > 爱技术 > 正文

算法日常:整数反转(LeetCode)

题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。来源:力扣(LeetCode)

示例 1:

输入: 123 

输出: 321

示例 2:

输入: -123 

输出: -321

示例 3:

输入: 120

 输出: 21

注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。上面是题目,下面开始解题。

第一种解法:将整数转化成数组,然后颠倒顺序(似乎和冒泡排序类似),最后再转化为整数即可。

function reverse1($x) {
if ($x != abs($x)) {
	$x = abs($x);
	$p = 1;
}
$x = str_split($x);//打散为数组
for ($i = 0; $i < count($x) / 2; $i++) {
	$tem = $x[$i];
	$x[$i] = $x[count($x) - $i - 1];
	$x[count($x) - $i - 1] = $tem;
}
$x = intval(implode('', $x));
if ($x > pow(2, 31)) {//判断整数是否溢出
	$x = 0;
}
if (!empty($p)) { //判断是否为复制
	$x = -$x;
}
return $x;
}

这种解法虽然看起来代码多,但是思路笔记清晰,就是利用str_split()函数先把整数打散为数组,然后就依次将第一位与倒数第一位,第二位与倒数第二位......颠倒位置,最后再转换成数字即可。 

第二种解法: 

这种方法代码笔记简短,利用的数学方法,就是利用不断取余的方法。来反转整数。

function reverse($x) {
	$newx = 0;
	while ($x != 0) {
		$newx = $newx * 10 + intval($x % 10);
		$x = intval($x / 10);
	}
	if (abs($newx) > pow(2, 31)) {
		$newx = 0;
	}
	return $newx;
}

代码笔记短,认真看一下,相信没什么问题的。

作者K先生本文地址http://www.gold404.cn/info/36

版权声明:本文为原创文章,版权归 K先生个人博客 所有,欢迎分享本文,转载请保留出处,谢谢!

文章评论

* 必填
可选
可选

评论列表