• 反转一个整数的各位数字


    Reverse digits of an integer.

    Example1: x = 123, return 321
    Example2: x = -123, return -321

    click to show spoilers.

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

  • 相关阅读:
    9、Spring Boot 2.x 集成 Thymeleaf
    【专题】Spring Boot 2.x 面试题
    8、Spring Boot 2.x 服务器部署
    7、Spring Boot 2.x 集成 Redis
    6、Spring Boot 2.x 集成 MyBatis
    5、Spring Boot 2.x 启动原理解析
    4、Spring Boot 2.x 自动配置原理
    3、Spring Boot 2.x 核心技术
    2、Spring Boot 2.x 快速入门
    centOS下安装JDK1.8.60,glassfish4.1.1以及MySQL
  • 原文地址:https://www.cnblogs.com/xqnq2007/p/7492014.html
Copyright © 2020-2023  润新知