Reverse Integer LeetCode 第七题

题目链接 点此,题目描述如下:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321

直接使用int来处理输入的数据,虽然输入的时候不会溢出,但是并不能保证reverse之后不超出int的表示范围。在32bits中,int的表示范围为:

int   2147483648~2147483647

例如如果输入的是:1534236469,则反转后就变成9646324351,这就超出了int的表示范围,总的程序框架如下:

#include <stdio.h>
#define HIGH_BITS 0xFFFFFFFF10000000
#define UPPER_LIMIT 0x7FFFFFFF

int main(int argc, char* argv)
{
	int a = 0;
	int reverse(int x);
	while (scanf("%d", &a) != EOF)
		printf("%d\n", reverse(a));
	return 0;
}

int reverse(int x)
{
	int isNative = x > 0 ? 1 : -1;
	unsigned int native_X   = isNative * x;
	unsigned int tmpResult = 0;
	
	while(0 != native_X)
	{
		//取余
		//求和
	}
	return tmpResult * isNative;	
}

起初想到的以下三种方法:

F1:

在对tmpResult求和之前,先比较tmpResult*10 与 UPPER_LIMIT的大小,

while(0 != native_X)
{
	if (tmpResult * 10 > UPPER_LIMIT)
	{
		tmpResult = 0;
		break;
	}
	tmpResult = native_X % 10 + tmpResult * 10;
	native_X = native_X / 10;
}
如果使用这种方法,由于tmpResult为int类型,tmpResult*10获得的值也为int类型,如果使用1534236469,在最后一次循环中,即得到的964632435*10同样会超出int的表示范围,所以,需要将tmpResult换为__int64即64位

F2:

F1中的方法,虽然可以AC,但是效率不行,因为每次取余后都需要判断一次,严重影响了执行效率,经过考虑后将while中的判别条件放在return之前,这样会提高一下效率(从原来的12ms降低到8ms)

int reverse(int x)
{
	int isNative = x > 0 ? 1 : -1;
	unsigned int native_X   = isNative * x;
	 __int64 tmpResult = 0;
	
	while(0 != native_X)
	{
		tmpResult = native_X % 10 + tmpResult * 10;
		native_X = native_X / 10;
	}
	if (tmpResult > UPPER_LIMIT)
	{
		tmpResult = 0;
	}
	return tmpResult * isNative;	
}
这种方法本质上和F1相同,或许不应该称为F2

F3:
通过bit求&运算,但是这种方法还没调试好……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值