negative

问题:

Reverse digits of an integer.

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



我觉得这个问题要解决的思路就是分情况来讨论,如果说x为0,则返回x,如果x为负的,则吧x转化为0-x在运算,当然还需要注意防止溢出,我一开始就忘了防溢出,后面才加上。然后在用正数来实施我们的reverse。

代码:

class Solution {  
public:  
    int reverse(int x) {  
        if (x == 0)  
        {  
            return x;  
        }  
        bool negative = false;  
        if (x < 0)  
        {  
            negative = true;  
            x = 0 - x;  
        }  
        //检测该x是否已经溢出,溢出时直接返回0  
        int max = numeric_limits<int>::max();  
        if (x>max)  
            return 0;         
        //到此为止,x已经是非负值了  
        int nBits = 1, nAverage = 10;  
        int tmp = x;  
        while (true)  
        {  
            if (nAverage == 1000000000)  
            {  
                if ((tmp / nAverage<10)&&(tmp/nAverage!=0))  
                {  
                    nBits++;          
                    break;  
                }  
            }             
            if (tmp / nAverage)  
            {  
                nBits++;  
                nAverage *= 10;  
            }  
            else  
                break;  
        }  
        //到现在为止 nBits是和x位数一致,nAverage和x的位数也是一致的  
        int* nArray = new int[nBits];  
        int  nCount = 0;  
        tmp = x;  
        if (nBits != 10)  
        {  
                    //如果nBits不为0,也就是肯定没有溢出的情况下,则nAverage的值是多乘了一个10,进行矫正  
                     nAverage /= 10;  
        }  
        while (nCount<nBits)  
        {  
            nArray[nCount++] = tmp / nAverage;  
            tmp -= nAverage*nArray[nCount - 1];  
            nAverage /= 10;  
        }  
        //进行新数组的构造,作为返回值应该是防止溢出的,所以定义为unsigned long long,在int型数据下操作是没有问题的,  
        unsigned long long sum = 0;  
        for (int i = 0; i < nBits; i++)  
        {  
            unsigned long long mm = 1, m = 0;  
            while (m!=i)  
            {  
                mm *= 10;                 
                m++;  
            }             
            sum += (unsigned long long)nArray[i] * mm;  
                        if (sum>max)  
                return 0;  
        }  
        delete[] nArray;  
        if (negative)  
        {  
            sum = 0 - sum;  
        }  
        return sum;  
    }  
};  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值