题记:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
题目来源:
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnx13t/
来源:力扣(LeetCode)
自己敲出来的答案:
一:对称交换
class Solution {
/**
* @param Integer $x
* @return Integer
*/
function reverse($x) {
//拆分为数组
$x_arr = str_split($x);
if($x < 0){
//如果小于0去除"-"符号元素
array_splice($x_arr, 0, 1);
}
//对称交换
$length = count($x_arr);
for($i = 0; $i < $length / 2; $i++){
$temp = $x_arr[$i];
$x_arr[$i] = $x_arr[$length - $i -1];
$x_arr[$length - $i - 1] = $temp;
}
if($x < 0){
$int_x = -(int)(implode($x_arr));
}else{
$int_x = (int)(implode($x_arr));
}
if($int_x > (pow(2,31) - 1) || $int_x < -pow(2,31) || $int_x == 0){
$int_x = 0;
}
return $int_x;
}
}
$x = -123;
$solution = new Solution();
$result = $solution->reverse($x);
print_r($result);
/**
输出结果为:-321
*/
二:双指针交换
<?php
class Solution {
/**
* @param Integer $x
* @return Integer
*/
function reverse($x) {
//拆分为数组
$x_arr = str_split($x);
if($x < 0){
//如果小于0去除"-"符号元素
array_splice($x_arr, 0, 1);
}
//双指针交换
$length = count($x_arr);
$left = 0;
$right = $length - 1;
while($left < $right){
$temp = $x_arr[$left];
$x_arr[$left] = $x_arr[$length - $left -1];
$x_arr[$length - $left - 1] = $temp;
$left++;
$right--;
}
if($x < 0){
$int_x = -(int)(implode($x_arr));
}else{
$int_x = (int)(implode($x_arr));
}
if($int_x > (pow(2,31) - 1) || $int_x < -pow(2,31) || $int_x == 0){
$int_x = 0;
}
return $int_x;
}
}
$x = -123;
$solution = new Solution();
$result = $solution->reverse($x);
print_r($result);
/**
输出结果为:-321
*/
官方给出的PHP解法代码:
class Solution {
/**
* @param Integer $x
* @return Integer
*/
function reverse($x) {
$m = pow(2,31); //临界值
$s = intval(strrev(abs($x))); //将绝对值反转
return $x>=0?($s>$m?0:$s):($s>$m?0:"-".$s); //判断是否添加"-"符号
}
}
官方给出的java解法:
1,翻转每一位数字即可,原理比较简单,我们直接来看图分析
public int reverse(int x) {
int res = 0;
while (x != 0) {
int t = x % 10;
int newRes = res * 10 + t;
//如果数字溢出,直接返回0
if ((newRes - t) / 10 != res)
return 0;
res = newRes;
x = x / 10;
}
return res;
}
2,实际上我们还可以改的更简洁一下
public int reverse(int x) {
long res = 0;
while (x != 0) {
res = res * 10 + x % 10;
x /= 10;
}
return (int) res == res ? (int) res : 0;
}
官方代码来源:
作者:数据结构和算法
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnx13t/?discussion=ukHfZx
来源:力扣(LeetCode)