给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
image.png解题思路一
1.先判断是否负数,获取符号;
2.转换$x为字符串,获取字符长度;
3.循环:根据字符索引替换相应字符位置,循环次数为字符长度的一半(舍弃法取整),即完成了整个字符串的替换;
4.判断是否溢出;
<?php
class Solution
{
/**
* 整数反转
* @param $x
* @return int|string
*/
function reverse($x)
{
$f = $x < 0 ? '-' : '';//判断正负
$x = abs($x) . '';// 取绝对值,并且转换成字符串
$len = strlen($x);// 字符串的长度
$half = floor(($len-1) / 2);//取一半进行对调
for ($i = 0; $i < $len; $i++) {
$target = $len - $i - 1; // 首尾对调
$tmp = $x[$target];
$x[$target] = $x[$i];
$x[$i] = $tmp;
if ($i == $half) {
break; //至此已完成整个字符串字符的位置替换
}
}
$x = intval($f . $x);// 字符串转换成整数
if ($x > 2147483647 || $x < -2147483646) {
return 0;
} else {
return $x;
}
}
}
$solution = new Solution();
echo $solution->reverse(-12340).PHP_EOL;
echo $solution->reverse(10).PHP_EOL;
结果:
-4321
1
解题思路二
<?php
class Solution
{
/**
* 整数反转
* @param $x
* @return int|string
*/
function reverse($x)
{
if ($x == 0) {//特殊情况
return $x;
}
$y = ltrim(strrev("$x"), 0);//反转且剔除左侧的0
if ($x < 0) {//负数
$y = rtrim($y, '-') * -1;//剔除右侧的负号,*-1变成负数
if ($y < -2147483647) {
return 0;
}
}
if ($y > 2147483647) {
return 0;
}
return $y;
}
}
$solution = new Solution();
echo $solution->reverse(-12340) . PHP_EOL;
echo $solution->reverse(10) . PHP_EOL;
解题思路三
本题如果不考虑溢出问题,是非常简单的。解决溢出问题有两个思路,第一个思路是通过字符串转换来解决,第二个思路就是通过数学计算来解决。
通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出。
<?php
class Solution
{
/**
* 整数反转
* @param $x
* @return int|string
*/
function reverse($x)
{
$rev = 0;
while ($x) {
if ($x < 0) {
$flag = -1;
} else {
$flag = 1;
}
$pop = $x % 10;
$x = intval(floor(abs($x) / 10)) * $flag;
if (($rev > 2147483647 / 10) || (($rev == 2147483647 / 10) && ($pop > 2147483647 % 10))) {
return 0;
}
if (($rev < -2147483647 / 10) || (($rev == -2147483647 / 10) && ($pop < -2147483647 % 10))) {
return 0;
}
$rev = intval($rev * 10 + $pop);
}
return $rev;
}
}
$solution = new Solution();
echo $solution->reverse(1534236469) . PHP_EOL;
echo $solution->reverse(-40) . PHP_EOL;
echo $solution->reverse(10) . PHP_EOL;
结果:
0
-4
1
网友评论