1. 程式人生 > >Leetcode演算法練習-easy篇-Reverse Integer

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++中的溢位檢查相對容易。