7 整数反转

作者: 046ef6b0df68 | 来源:发表于2019-04-06 20:11 被阅读16次

    文|Seraph

    01 | 问题

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

    示例 1:

    输入: 123
    输出: 321

    示例 2:

    输入: -123
    输出: -321

    示例 3:

    输入: 120
    输出: 21

    02 |解题

    初解:

    整体思路还是很明显,就是利用除余10,来获取每位的具体数字,然后进行反转计算。

    class Solution {
    public:
        int reverse(int x) {
            if(x>-10 && x<10)
                return x;
            long result=0;
            bool flag = x<0 ? 1:0;
            int y;
            int x1=abs(x);
            do
            {
                y = x1%10;
                result *= 10;
                result += y;
                
            }while(x1 /= 10);
            
            if(flag)
                result = -result;
            if(result > INT_MAX || result < INT_MIN)
                    return 0;
            return (int)result;
        }
    };
    

    如上代码,发现又犯了整个while循环判断条件不能处理所有情况的,需要额外增加特殊边界处理的代码段。

    终解:

    如上发现的情况,经常会出现自己写do while语句,所以以后尽量按自己常用的while语句习惯写,就容易判断所有情况了。
    同时,我们需要注意,如上代码虽然过了,但是使用了一个long型数据,按题的意思本不该支持大于32位以上整数的数据的。
    可见如下:

    class Solution {
    public:
        #define INT_MAX 2147483647  
        #define INT_MIN (-INT_MAX - 1)  
          
        int reverse(int x) {  
            int flag = 1;//设置正负指示  
            if (x < 0)
            {  
                flag = -1;  
                x = -x;  
            }  
          
            int num = 0;  
            while (x > 0)
           {  
                if ((num != 0 && (INT_MAX / abs(num) < 10)) || ((unsigned int)abs(num * 10) + (unsigned int)(x % 10) > INT_MAX))
               {//溢出  
                    return 0;  
                }  
                num = num * 10 + flag * (x % 10);  
                x = x / 10;  
            } 
            return num;  
        }
    };
    

    03 | 积累知识点

    1 尽量考虑题目本应该受限的一些条件,因为我们编程使用的环境有时候确实不是我们能控制的,所以适应环境的编程方法还是很重要。

    相关文章

      网友评论

        本文标题:7 整数反转

        本文链接:https://www.haomeiwen.com/subject/aohuyftx.html