题记:
由于临近毕业要找工作,虽然看了一遍数据结构和算法,但是总感觉心里发虚。而且项目中所接触到得编程都是基于其他方面得改进算法,总之本人编程能力有限,经常被人鄙视,所以下定决心,慢慢爬行,一点点刷leetcode,这也是写这些博客得缘由,记录在遇到题目时得分析思路,及解决方法。
---------- 我走的慢,但我从不后退。
===============================================================================================================
题目:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
愚解:
看到这个题目不要上来动手写程序,为什么?因为你没有考虑周全,如果上来就写,在写程序得过程中会发现很多情况,就会卡在那里。应该分析,主要有一下几点;
1.如果末尾是0改怎么输出,如10 ,100,
2. 所要重点注意得溢出,因为int类型不管有无符号都有其边界值,超过边界值时就会溢出,如1000000003 ,本题目假的溢出时返回结果为0
从分析来看,该题目重点考察的时对溢出情况得处理,那么对于一个整数,我们很容易取得各位上得数字,但是如何判断将它反转是否溢出呢,这个问题我也了好久,也尝试了几种方法,但我觉最可靠得是下面得一种思路。对于一个整数,不管它是正还是负,如果翻转之后不溢出得话,那么翻转前得数字应该与翻转后得数字相同,如 : 翻转前 123,翻转后 321 ,如果不溢出,那么翻转后最高位上得数字必须等于翻转前最低位上得数字,一旦不相同,那么在翻转得过程中肯定出现了溢出,可以直接 return 0 处理。明白了这个道理,那么代码新手拈来:
/*************************************************************************
> File Name: reverseInteger.cc
> Author: Jerry Shi
> Mail: jerryshi0110@gmail.com
> Created Time: 2014年12月28日 星期日 10时43分39秒
************************************************************************/
#include<iostream>
#include<cstdlib>
using namespace std;
class Solution
{
public:
int reverse(int x)
{
int sign = (x < 0) ? -1 : 1;
x = abs(x);
char buf[12]; //max length of int is 10
int i = 0;
int j = 0;
int result = 0;
int temp;
//get sign
while(x)
{
buf[i] = x % 10;
x /= 10;
result = result*10 + buf[i];
++i;
}
temp = result;
while(i)
{
if(temp % 10 != buf[i-1])
{
return 0;
}
temp /= 10;
--i;
}
return sign * result;
}
};
int main(void)
{
int test = 1534236469;
Solution mtest;
int result;
result = mtest.reverse(test);
cout << "inverse result: " << result << endl;
return 0;
}
提交代码之后,测试通过,测试结果时用时 60ms,上述得代码可以更精简,但主旨得解决方法不变。后来又看讨论区中大家得方法,基本都是采用上述分析得方法去判断是否溢出,还有一个时用一个int64得变量来接收翻转后得结果,然后与INT_MAX和INT_MIN进行比较判断是否溢出,此方法针对此种情形可以解决问题,但若给定得uint64,则行不通。