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,因为算术运算的最大值不能超过最大值,不然就溢出没法计算了,因为它表示不了,,