您的位置:首页 > 编程语言 > C语言/C++

整数反转

2016-06-19 00:07 309 查看
题目出处
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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 整数反转