leetcode 2---Reverse Integer

题记:

       由于临近毕业要找工作,虽然看了一遍数据结构和算法,但是总感觉心里发虚。而且项目中所接触到得编程都是基于其他方面得改进算法,总之本人编程能力有限,经常被人鄙视,所以下定决心,慢慢爬行,一点点刷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,则行不通。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值