zoukankan      html  css  js  c++  java
  • 7-整数反转

    题目:

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

    示例 1:

    输入: 123
    输出: 321
     示例 2:

    输入: -123
    输出: -321
    示例 3:

    输入: 120
    输出: 21
    注意:

    假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

    解答:

    • 首先想到的是字符串反转,然后类型转换,效率不行
    • 重点在于判断是否溢出,采用较长的数据类型来存储结果,下面采用的是long long,官方答案有更好的方法
    • 注意最后判断使用的方法:判断强制类型转换为int后是否与原数据相等,如果相等则没有溢出
    • while循环的判断条件:x!=0 因为x每次 /=10 最终肯定为0,这样不用判断数据是否为正负

    注意:

      写完代码后,需要找几个特殊输入进行测试,例如0 10 等情况,以减少代码bug。

    int reverse(int x) 
    {
            if (x<10 && x> -10)//只有一位的直接返回
            {
                return x;
            }
    
            long long result = 0;
            while (x != 0)
            {
                result = result*10 + (x % 10);
                x /= 10;
            }
    
            return ((int)result ==result)? (int)result : 0;
        }

     答案给的判断溢出:

    while循环中,result = result *10 + x%10; 在这里判断

    • result > MAX_INT/10,因为之后要*10再加上余数;
    • 如果 result==MAX_INT/10,则判断 x%10 是否  > MAX_INT%10,即加上的数字是否刚好超过MAX_INT的最后一位,对于32bit的int,最后一位为7
    • 如果 x < 0 按照类似的逻辑判断
    • 采用 MAX_INT%10  MIN_INT%10可以不用记住末位的数字,而且后续也好扩展
    • 上面采用long long 存储结果是取巧行为,如果要写成一个模板方法的话,直接不能用了,所以还是要分析细节
  • 相关阅读:
    七牛云上传博客
    .net 导入Excel
    liunx ln -s 软连接
    dos2unix 命令
    x-csrf-token
    设置git 不提交 修改权限的文件
    nginx 启动、重启、关闭
    命令行导入mysql数据
    mongo 相关命令
    laravel 安装完成后安装 vendor 目录
  • 原文地址:https://www.cnblogs.com/zyk1113/p/13802957.html
Copyright © 2011-2022 走看看