题目出处
https://leetcode.com/problems/reverse-integer/
反转一个整数。
例:
123 输出 321.
-456 输出 -654
分析:
里面有个点需要注意的就是溢出。
目前我能想到的就是把整数扩展到long来处理。
说明:
这个算法从写第一版本后,改进过两个版本,一共有三个版本的代码, 代码都是越来越精简。
你会发现最后版本的代码真的挺美的!
算法1 原始代码
主要考虑了3点:
1. 把输入作下处理,如果是负数,让他转成正数(long类型)来处理。(由于我不太确定负数的mod的结果)
2. 用局部数组来做了缓存每次mod的结果, 后面通过缓存得到结果。
3. 用long来存储结果。
代码:
int reverse_1(int v) {
if(v > -10 && v < 10)return v;
long x = v;
//get sign;
int sign = 1;
if(x < 0){
x = -x;
sign = -1;
}
//get number list
int vec[15];
int i = 0;
while(x >= 10){
vec[i++] = x%10;
x = x/10;
}
vec[i++] = x;
if(i > 9){
if(vec[9] > 2)return 0;
if(vec[9] == 2 && vec[8] > 1) return 0;
}
//calculator result
long ret = 0;
for(int j = 0; j < i;j++)
{
ret = ret*10 + vec[j];
if(ret > 0x7FFFFFFF)
return 0;
}
if(ret != (int)ret) return 0;
//return result
return sign * ret;
}
算法2: 代码优化一
优化, 不再实例缓存。
int reverse_0(int v) {
long x = v;
int sign = 1;
if(x < 0){
x = -x;
sign = -1;
}
long ret = 0;
while(x > 0){
ret = ret*10 + x%10;
x = x/10;
}
if(ret != (int)ret) return 0;
return sign * ret;
}
算法3, 进一步优化
由于试验了一下, -4%10 == -4. 所以可以不再对输入的符号作判断。
int reverse(int v) {
long ret = 0;
for(int x = v; x != 0; x/=10)
ret = ret*10 + x%10;
if(ret != (int)ret) return 0;
return ret;
}