Leetcode算法练习-easy篇-Reverse Integer

Leetcode算法练习##

easy篇-Reverse Integer

最近正式入驻Leetcode,从今天开始会陆陆续续的整理在Leetcode 上的题目,用于笔记的整理与交流,而且除了自己的做法之外还会整理一些其他的好算法,并进行简单的分析与分享,考虑到算法的训练并不多,希望大家可以多多包涵。


题目要求:
Reverse digits of an integer.

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

click to show spoilers.

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

题目不难,但我的做法比较扭曲。。。

int reverse(int x) {
    int _[1000] = {0};
    int i = 0,j =0, k =0;
    int count = x;
    int ret = 0,sum = 1;
    if(x > 0)
    {
        for(i = 1; count >= 10; i++)
        {
            _[i] =  count % 10;
            count = count / 10;
        }
        _[i] = count;
        for(k = 1; k <= i; k++)
        {
            for(j = 0; j < i - k; j++)
            {
                sum *= 10;
            }
            ret += sum * _[k];
			sum = 1;
        }
        goto End;
    }
    if(x < 0)
    {
        count = -count;
        for(i = 1; count >= 10; i++)
        {
            _[i] =  count % 10;
            count = count / 10;
        }
        _[i] = count;
        for(k = 1; k <= i; k++)
        {
            for(j = 0; j < i - k; j++)
            {
                sum *= 10;
            }
            ret += sum * _[k];
			sum = 1;
        }
		ret = -ret;
        goto End;
    }
End:
    return ret;
}

冗余代码过多,导致程序复杂很多,导致效率很低,而且还没有考虑到整型的溢出问题,当做反面教材吧。。。


正常解法:

int reverse(int x) {
        if (x == 2147483412 )
            return 2143847412;
        if (x == -2147483412)
            return -2143847412;
        if (x > 1463847412 || x < -1463847412)
            return 0;

        int m = x/10;
        int n = x%10;
        int res = 0;
        while (m != 0) {
            res = res * 10 + n;
            n = m%10;
            m = m/10;
        }
        res = res * 10 + n;
        return res;
}

首先感谢这位同学的代码了,果真不应该按照样例的输入进行考虑啊,正向除数,之后接着反向加过了就可以了。。。


同时我也找了一下C++的做法,目前优化的最好的应该就是下面这种了,

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

而且本题在C++和C的性能提高不大,而且因为有高级语言的特性,在C++中的溢出检查相对容易。

猜你喜欢

转载自blog.csdn.net/fair_angle/article/details/70577749
今日推荐