题目
Given a 32-bit signed integer, reverse digits of an integer.
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路
先提取符号信息并置为正,然后循环提取每一位存储(这时候先截下来的是最低位).
再将其从Array[0]
拼起来.(这样可以自动省略最高位的0).最后判断范围,如果溢出就输出0.
(PHP是弱类型,有溢出机制吗?)
代码
class Solution {
/**
* @param Integer $x
* @return Integer
*/
function reverse($x) {
$datapan=array();
if($x<0)
{
$signflag=1;//negative number flag
$x=-$x;
}
for($bits=0;$x!=0;$bits++)
{
$datapan[$bits]=$x%10;
$x=($x-$datapan[$bits])/10;
}//Interruption
for($i=0;$i<$bits;$i++)
{
$output+=$datapan[$i]*pow(10,$bits-$i-1);
}
if($signflag==1)
{
$output=-$output;
}
if($output>(pow(2,31)-1)||$output<-pow(2,31))
{
return 0;
}
else
return $output;
}
}
性能情况和总结
XD 的确写的代码没有充分利用PHP的特性,还是把php当作一个弱类型的C来写的…
看看大部分代码是怎样的:
class Solution {
function reverse($x) {
$newx=abs($x);
$num=strlen($newx);
for($i=0;$i<$num;$i++){
$numarray[]=substr($newx,$i,1);
}
$numarray=array_reverse($numarray);
$newnum=implode($numarray);
if($x<0){
$newnum=$newnum*-1;
if(pow(-2,31)>$newnum){
return 0;
}else{
return $newnum;
}
}else{
$newnum=$newnum*1;
if(pow(2,31)<$newnum){
return 0;
}else{
return $newnum;
}
}
}
}
先用abs()
提取数字部分,并用strlen()
提取数字长度(这里把$x
作为了一个字符串).
用substr($str,$startdigit,$length)
返回每一位顺序储存进$numarray
.(注意:$numarray
是一个数组)然后直接用array_recerse()
反转输出进原数组.
用implode()
将数组组合为新字符串,最后仍是校验是否溢出.检验溢出的时候只用根据符号检验一个就可以了.
函数的运用还是要学习一个XD
顺便一说,有些强类型语言可以通过类型溢出报错来判断是否应该输出0.