LeetCode中Reverse Integer

这只是我学习记录用的,不要太较真。

Reverse Integer是我做的第二个LeetCode算法题
- Reverse digits of an integer.
- Example1: x = 123, return 321
- Example2: x = -123, return -321
- The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
- 输入假定为32位有符号整数。当反转的整数溢出时,您的函数应返回0。


目录

[TOC]来生成目录:

主要思路

网上有许多种答案,一种是先转化成字符串,然后进行逆序;一种是从最后一位开始取,每取得一个数n,把n放在新数sum的最后一位,同时证明之前得到的数sum都要向前进一位,即sum=sum*10+n。

我的主要思路是,先确定数字的长度,然后交换两边位置。
例如:12345,取得1和5交换位置,即:sum = sum + 1*1+5*1000。

代码一

从个位开始统计数字长度。

            long i = 1;
            long sum = 0;
            long sum1 = 0;
            long sum2 = 0;
            long a = 0;
            long b = 0;
            if(x==0){
                return x;
            }
            for(;;i=i*10){    //找到x的最高位(统计长度)
                if(x/i == 0) break;
            }
            i = i/10;         //得到第一位数,如:12345 最高位:10000,而i此时为100000
            for(int j=1;i>=j;j=j*10,i=i/10){
                a = x/i;      //当取第二位时,得到a=12
                sum1 = a % 10;//得到第二位 2
                b = x/j;
                sum2 = b % 10;
                if(i==j){    //对于长度为基数时,进行此判断。
                    sum = sum + sum1*j;
                    break;
                }
                sum = sum + sum1*j + sum2 * i;
            }
            if (sum> Integer.MAX_VALUE || sum < Integer.MIN_VALUE){//判断是否溢出
                return 0;
            }
            return (int)sum;

代码二

从第一位开始统计数字长度。

        int i = 1000000000;
        long sum = 0;
        long sum1 = 0;
        long sum2 = 0;
        int a = 0;
        int b = 0;
        if(x==0){
            return x;
        }
        for(;i>=1;i=i/10){
            if(x/i != 0) break;
        }
        for(int j=1;i>=j;j=j*10,i=i/10){
            a = x/i;
            sum1 = a % 10;
            b = x/j;
            sum2 = b % 10;
            if(i==j){
                sum = sum + sum1*j;
                break;
            }
            sum = sum + sum1*j + sum2 * i;
            if (sum> Integer.MAX_VALUE || sum < Integer.MIN_VALUE){
                return 0;
            }
        }
        return (int)sum;

不用考虑正负号,因为正负号对结果没有影响。

总结

我这种思想,会发生很极端的现象,比如第一个代码,如果x取10 0000 0000,则会造成计算最高位时,就已经很耗时了,而第二个代码,如果x取1,同样也会很耗时。

我在想,如果把两段代码放在一起,首先用10 0000对x进行判断,如果x大于这个数用第二个代码,如果x小于这个数用第一个代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值