颠倒整数(LintCode)

题目来源:LintCode

原题地址:http://www.lintcode.com/zh-cn/problem/reverse-integer/#

题目:

将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数)。

您在真实的面试中是否遇到过这个题?  
Yes
样例

给定 x = 123,返回 321

给定 x = -123,返回 -321


难度级别:
容易

思路分析:
这个题目本身的做法是很简单的,数字的首尾颠倒就可以了。
如果是纸上写的话,我想应该受过小学教育的人都是会的。
但是这里要用程序来实现,那么我们知道,计算机的计算位数是有限的,整数的范围是从
-2147483648~2147483647的,
如果超出这个范围的话,返回的是0;
那么什么时候回超出这个范围呢?这是这个题的关键之处。直接去采用整数似乎不是那么好把握的,因此为了简单起见,
我采用的是,直接将数字转换成字符串来操作。
这样写的程序比较冗长了一点,但是实际的思路就会变得简单起来。
我不需要考虑,我翻转的数字,在翻转的过程中是否会超出范围,我也不用担心当超出范围的时候,不清楚具体位置。
我只要判断出是否是负数,是否在区间内,通过字符串判断也是十分方便的。

实现代码:
#include <iostream>

using namespace std;

//#define IntMax 2147483647
//#define IntMin -2147483648

class Solution
{
public:
	/**
	* @param n the integer to be reversed
	* @return the reversed integer
	*/
	int reverseInteger(int n)
	{
		char ch[100];
		sprintf(ch, "%d", n);
		int cnt = 0;
		while (ch[cnt] != '\0')
		{
			cnt++;
		}
		//cout << cnt << endl;
		int i = 0, j = cnt - 1;
		if ('-' == ch[i]) //判断是否是负数
		{
			i++;
		}
		char tmp;
		while (i < j) //数据颠倒
		{
			tmp = ch[i];
			ch[i] = ch[j];
			ch[j] = tmp;
			i++; j--;
		}
		i = 0; //指针重新指向最前端
		if ('-' == ch[i])
		{
			//判断是否小于最小值-2147483648
			char intMin[] = "-2147483648";
			i++;
			if (cnt == 11)
			{
				while (ch[i] != '\0')
				{
					if (intMin[i] > ch[i])
					{
						break;
					} else if (intMin[i] < ch[i])
					{
						return 0;
					} else
					{
						i++;
					}
				}
			}
		} else
		{
			//判断是否大于最大值 2147483647
			char intMax[] = "2147483647";
			if (cnt == 10)
			{
				while (ch[i] != '\0')
				{
					if (intMax[i] > ch[i])
					{
						break;
					} else if (intMax[i] < ch[i])
					{
						return 0;
					} else
					{
						i++;
					}
				}
			}
		}
		sscanf(ch, "%d", &n);
		return n;
	}
};


代码说明:
需要注意的是,判断是否在区间中的时候,我先判断了超出的可能性,如果是负数的话,只有数字字符是11位时才有可能,多出来的一位是负号;
如果是正数的话,数字字符是10位时才有可能。其他的位数(只会小,不会大的)都不可能有超出的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值