Reverse Integer翻转整数

27 篇文章 0 订阅

问题描述:

翻转整数,当超出32位整数的表示范围时,返回0。

Reverse digits of an integer. Returns 0 when the reversed integer overflows (signed 32-bit integer).

示例:

输入:123,输出:321;输入:-123,输出:-321。

思路一:使用可变长度的vector容器存放“输入数值的每一个十进制位”,翻转存放各位数,即个位存在数组的第1个位置,十位存在数组的第2个位置,依次类推。根据vector<int>容器的大小,计算十进制数各位需要乘的幂次。用long long int暂时存放最终翻转后数的绝对值,如果超过32位整数的范围,则中断,并返回0。

空间代价:vector<int>数组,及其迭代器,表示数正负的标志bool,暂存结果的long long int型整数。

代码调试阶段碰到的bug:

(1)输入:-10,输出-10?,输出应为-1。

代码第一条判断,必须是“输入数值的绝对值”只有个位数,直接返回,之前忘加abs操作。

存放翻转结果的数组内,前面可能含有“无效的0”,需要去掉。

(2)输入:1534236469,输出:-1501159297?,输出应为0。

翻转后的数超出32位有符号整数的范围。暂时通过暂存结果变成long long int,并加范围判断来规避这一问题。

代码如下:

int reverseInteger(int n) {
        // write your code here
        if (abs(n/10) < 0 ) return n;
        if (n>INT_MAX || n<INT_MIN) return 0;
        bool flag = 0;
        if (n<0) {
            n = abs(n);
            flag = 1;
        }
        vector<int> r;
        while(n) {
            r.push_back( n%10);
            n = n/10;
        }
        int rs = r.size();
        // remove useless prior zeros
        for (int i=0; i<rs; i++)
        {
            if (r[i] == 0)
            {
                r.erase(r.begin()+i);
                i--;
                rs = rs-1;
            }
            else {
                break;
            }
        }
        long long int res = 0;
        for (int i = 0; i < rs; i++) {
            res += r[i]*pow( 10,(rs-i-1) );
            if (res>INT_MAX) return 0;
        }
        if (flag==1) res = - res;
        if (res>INT_MAX || res<INT_MIN) return 0;
        return int(res);
}

思路二:定义一个整数整数翻转后的结果,直接将原整数从个位数开始,边存入临时结果,并乘以10,边逐位地往前迭代。

参考:https://cloud.tencent.com/developer/article/1403065

代码如下:

     /**
     * @param n: the integer to be reversed
     * @return: the reversed integer
     */
    int reverseInteger(int n) {
        long res = 0;
        while (n != 0) {
            res = res * 10 + n % 10;
            n /= 10;
            if (res > INT_MAX || res < INT_MIN) return 0;
        }
        return (int)res;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值