Leetcode演算法練習-easy篇-Reverse Integer
阿新 • • 發佈:2019-01-01
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++中的溢位檢查相對容易。