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++中的溢出检查相对容易。