Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
初始python解答:
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
fuhao=0
if x>=0:
fuhao=1
else:
fuhao=-1
revstr=str(abs(x))[::-1]
newint=int(revstr)*fuhao
maxint=math.pow(2,32)-1
minint=math.pow(2,32)*(-1)
if newint>minint and newint<maxint:
return newint
else:
return 0
此处计算绝对值字符串的反转串时,也可以先把字符串转为list,再反转list,然后再合并List。
lint=list(str(abs(x)))
lint.reverse()
revstr=''.join(lint)
下面是c++版,万恶的c++啊,反转个字符串也得自己弄,
#include<iostream>
using namespace std;
#include<string.h>
#include<math.h>
class Solution {
public:
int reverse(int x) {
int fuhao=0;
if(x>=0){
fuhao=1;
}else{
fuhao=-1;
}
//cout<<fuhao<<endl;
int absint=abs(x);
char revstr[20];
sprintf(revstr,"%d",absint);
//cout<<revstr<<endl;
int lenrev=strlen(revstr);
//cout<<lenrev<<endl;
for(int i=0;i<lenrev/2;i++){
int tmp=revstr[i];
revstr[i]=revstr[lenrev-1-i];
revstr[lenrev-1-i]=tmp;
}
int revabs;
sscanf(revstr,"%d",&revabs);
//cout<<revabs<<endl;
revabs=revabs*fuhao;
//cout<<revabs<<endl;
unsigned int zero = 0;
int maxint=~zero/2;
int minint=maxint*(-1)-1;
cout<<maxint<<endl;
cout<<minint<<endl;
if(revabs>minint && revabs<maxint){
return revabs;
}else{
return 0;
}
}
};
int main(){
Solution s1;
int a=s1.reverse(-198);
cout<<a;
}
不过c++确实严谨,另外 ,复习一下,有符号整数最高位1表示为负,0表示正,负数在计算机中以补码表示,正数以原码表示,以钟表为例子,10-4=6, 10+8=18也是6,-4=+8, 4+8=12,补码就是除符号位外按位取反加1, -7在8位计算机上的表示就是1111 取反 1000 再加1 1001
所以10-7 可以理解为10+ (-7)
10二进制为1010 1010+1001 , 刚才最高位溢出,则为0011 为3,,钟表和计算机都 是一种计量机器,有个模的说法,钟表的模是12,计量范围是0-11,最大值是11,计算机来说,32位的计算机,最大值是2的21次方,最小值是0,计算机是2的位数次方,比如32位计算机是2的32次方,原码+1+反码=模
因此计算机中负数用反码+1 表示 ,,
用钟表来举例10-4=6,这个-4可以用+8表示这个8的得来就,11-4+1,,对于计算机来说 ,
还用刚才的10-7举例,
7的二进制是0111,那么它的补码是1000,是8,两者相加刚好得到最大的1111,是15,也就是四位计算机的最大值,这样再加个1,就,16就是模了,
因为-7相当于刚才那个补码+1,也就是1001,是9,刚才7+9=16,一个轮回,也就是负数相当于是模减去该数的绝对值,原因是经过一个轮回后,最高位溢出,刚好剩下的数是相同的,10-7 相当于加了25,10+25=35,减去模32得3,类似于钟表,25的得来是 32-7得来,对应于计算机中,刚好就是按位取反加一,绝也,计算机前辈绝也!
另外,关于为啥计算机中负数的最小值会比正数的最大值多1个,可以把负数的最小值理解为-0,因为最高位是符号位,所以最大的正数只能是2的31次方,最高位的0表示正号,但是对负数来说,最高位是1,这样0x80000000这个数就空了下来,可以理解为-0,,于是计算机中就定义为负的最小值,对于钟表来说,就是10点减去24点,等于负12,也刚好是10的位置,也就是说拿钟表来比喻的话,钟表表示的数的范围是-24-11,计算机来说,就是-2的32次方到正2的32次方减1,因为算术运算的最大值不能超过最大值,不然就溢出没法计算了,因为它表示不了,,