7. Reverse Integer

2017-09-21  本文已影响0人  YoungDayo
反转整型数字

Reverse digits of an integer.

![Uploading 007_553011.jpg . . .]

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

Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.


大致意思:反转整型数字。输入一个32位的有符号整型,你的函数应该返回0当整型数字溢出时。

常规解法:这道题虽然简单,但是很容易出错。大家可能会想到的常规解法,就是先将整型数转换成字符串,反转后再转换成整型,但是这种方法有个小问题就是当遇到一个长度为10的整型数,如果个位数很大,正向不溢出,反转后可能溢出,那么结果就会出错的。当然也有对应的解决策略,就是最后接收反转后的整型数的变量声明为long,这样就可以解决这个问题了,当然需要进行溢出判断,只要超过int型的数就返回0。

class Solution {
public:
    int reverse(int x) {
        stringstream stream;
        stream<<abs(x);
        string num;
        num=stream.str();
        int n=num.length();
        for(int i=0,j=n-1;i<j;++i,--j)
        {
            char c=num[i];
            num[i]=num[j];
            num[j]=c;
        }
        stringstream st(num);
        long y;
        st>>y;
        if(y>INT_MAX || y<INT_MIN)
        return 0;
        if(x<0)
        return -y;
        else
        return y;
    }
};

代码解释:因为在leetcode中没有C语言的一些库文件,string和int之间的转换函数不会被识别,我们可以采用c++中的流转换。先把这两种方法单独列出来,以后还会经常用。

1、int转string:

int a=10;
string st;
stringstream stream;
stream<<a;
st=stream.str();

2、string转int:

string st="10";
int a;
stringstream stream(st);
stream>>a;

其他解法:每次对整型数进行余10操作,这样每次操作后得到的都是原整型数的个位、十位、百位..等等,然后通过数学运算,可以将整型数通过运算实现反转。反转乘加操作过程的倒数第二步就可以进行溢出判断,因为如果倒数第二步都溢出,乘10以后肯定还是溢出。这个方法不用转换成字符串,比较适合。

class Solution {
public:
    int reverse(int x) {
        int t,y=0;
        while(x!=0)
        {
            t=x%10;
            if(y>INT_MAX/10 || y<INT_MIN/10)
            {
                return 0;
            }
            y=y*10+t;
            x/=10;
        }
        return y;
    }
};
上一篇下一篇

猜你喜欢

热点阅读