Excaliburer`s Zone

It was challenging, but not risky.

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一.题目链接:https://leetcode.com/problems/reverse-integer/

二.题目大意:

  给定一个整数,要求反转该整数之后再返回;如果归返回的整数超过了int型整数的表示范围,则返回0。例如:输入123,返回321。

三.题解:

  这道题目在思路上并不难,主要还是在代码的实现上,这里我主要有两种实现方式。

方法1:将数字转换成字符串,然后计算出该字符串的长度,根据长度和字符来生成一个反转后的数字。代码如下:

class Solution {
public:
    int reverse(int x) {

        stringstream ss;//通过stringstream将int转化成string
        ss<<x;
        string str = ss.str();
        int len = str.size();
        int pos[len] = {0};
        int num = -1;//根据字符的位置来决定乘以10的num次方
        long temp = 0;
        int flag = 0;//用于标记是否为负数
        for(int i = 0; i < len; i++)
        {
            if(str[i] == '-')
            {
                flag = 1;
                continue;
            }

            else
            {
                num++;
                temp += ((str[i] - '0') *pow(10,num));
            }

        }

        if(flag == 1)
            temp = -1*temp;
        if(temp > (pow(2,31) -1) || temp < -pow(2,31))
                temp = 0;
        return temp;
    }
};

此方法时间复杂度为O(n),空间复杂度为O(n)。

方法2:该方法是直接对整数x进行处理,每次利用x%10来求x的个位的数字,利用x/10来求剩余部位的数字,并利用个位数字进行迭代。代码如下:

class Solution {
public:
    int reverse(int x) {
        long long  num = 0;
        while(x)
        {
             num = num * 10 + x % 10;
             x /= 10;
        }
        return (num > INT_MAX || num < INT_MIN)?0:num;

    }
};

这种方法的关键在于:num = num * 10 + x % 10这一步骤,实际上就是每次利用x的个位的数字当做反转后数字的高位数,此处的思想还是非常巧妙的,很值得借鉴!此方法的时间复杂度为O(n),空间复杂度为O(1)。对于此方法有几点需要注意:

1.这种方法,不用区分正负数,因为如果x为负数的话,不论是他的余数还是整除后的结果都是负数。例如-123对10取余数的话,那么结果是-3;整除10的话,结果是-12。

2.此方法,不用预先知道x的位数,每次迭代,上次的个位数就会乘以10(高上1位),这次的个位数就会变成反转后数字的个位数字;所以说这种思想(也可以认为一种技巧)一定要掌握。尤其是”它不用事先知道x的位数”这个重要的性质,以后很可能用得着。

posted on 2017-12-18 18:27  Excaliburer  阅读(212)  评论(0编辑  收藏  举报