整数反转

整数反转

描述

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

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

思路

  • 提取正负号
  • 转化为正数后提取每一位数
  • 倒序将提取出的数赋值相加
  • 溢出判断
int reverse(int x){
    char sign = 1,nums = 0,value[10] = {0};
    int final = 0;
    long final_long = 0;
    //符号提取,数字提取
    if(x < 0) {
        if(x == -2147483648)//-2^31,溢出无法转化正数,且反转后溢出
            return 0;
        else
            x = -x;
        sign = -1;
    }
    //获取x位数
    for(;x;nums++) {
        value[nums] = x % 10;
        x = x / 10;
    }

    for(int i=0;nums > 0;nums--) {
        final_long += value[i++];

        if(nums > 1)//还有下一位
            final_long *= 10;
    }
    final = (int)final_long;
    if(final == final_long)
        return final * sign;
    else
        return 0;
    
}

注意

  • 错误检查一个是能否转化为合格正数,一个是反转后是否发生溢出

    -------------------------------------------分割线!!!!-------------------------------------------------------

更新

在网上看到一些其他人的解法,醍醐灌顶,直接可以将上述代码简化很多很多,直接上代码:

int reverse(int x){
    int final = 0;
    long final_long = 0;   

    while(x) {
        final_long = final_long * 10 + x % 10;
        x = x / 10;
    }
    final = (int)final_long;
    if(final == final_long)
        return final;
    else
        return 0;
    
}
  1. 原本的提取正负号,其实根本没有必要,因为正数和负数在运算过程中,唯一不同的就是取余的最后一位,负数最后一位的取余是带着正负号的,所以直接算就可以了,自己还是思维比较死板啊,想当然地多此一举
  2. 最终结果的计算和取余的过程可以合在一起,我之前总是纠结于要得到整数的位数,才能继续计算,其实就像上面一样,取一次余继续×10就可以了,过程真的简化了好多好多
  • 自己的定式思维在没有直接对比时真的完全意识不到有多少学习,这道题算是没有白做,学到了很多
原文地址:https://www.cnblogs.com/ekkone/p/11667178.html