关于leetcode中整形溢出的几道题。

题一:String to Integer (atoi)

 

主要是要注意这里的输入输出的特列:

题目的要求是:1

1. 前面的空格可以忽略;

2. 第一个非空格要么是整数,要么是'+','-';如过不是这些就返回0;

3. 要考虑整型溢出的情况。

大致就是这么三点

/*------------------------------------atoi -----------------------------------*/
/*LeetCode Accept
需要的测试用例:
+1
1
-1
2147483648  等  需要注意的是 INT_MAX + 1是一个负值。还有就是这里面的测试用例。

*/
int test_atoi(string str)
{
	if (str.empty())
		return 0;
	bool first = 1;
	int sign = 1;
	long long int value = 0;
	for (string::iterator iter = str.begin(); iter != str.end(); iter++)
	{
		if (first)
		{
			if (*iter != ' ')
			{
				if (*iter=='+'||*iter=='-'||isdigit(*iter))
				{
					first = 0;
					*iter == '-' ? sign = -1 : sign;
					if (isdigit(*iter))
						value = *iter - '0';
				}
				else
					return 0;
			}
			else
				continue;

		}
		else
		{
			if (isdigit(*iter))
			{
				value = value * 10 + *iter - '0';
				if (sign == 1 && value > INT_MAX)
				{
					return INT_MAX;
				}
				else if (sign == -1 && -value < INT_MIN)
				{
					return INT_MIN;
					
				}
			}
			else
			{
				break;
			}

		}
	}

	return value*sign;
}

题二:Reverse Integer

将一个整数逆序,这个题相比上一题还是很直观的,只需要辗转相除然后重新赋值就好。

因为输入是int,所以不会出现输入溢出的情况,但是我们翻转的时候会出现溢出,所以需要考虑,还有一点就是

这里取abs或者取反的时候,INT_MIN 和 -INT_MIN是相同的值,所以要特殊处理。

/*--------------Reverse Integer-------------*/
/*
需要注意的测试用例是:
当输入值是 INT_MIN的时候。
考虑溢出的情况了。所以用long long型来定义。
*/
int reverse(int x)
{
	bool negative = false;//是否为负数
	if (x == INT_MIN)   //INT_MIN = -INT_MIN 仍然是个负数,所以特别做判断
		return 0;
	if (x<0)
	{
		negative = true;
		x = -x;
		
	}
	long long value = 0;
	while (x != 0)
	{
		value = value * 10 + x % 10;
		x /= 10;
	}
	if (value>INT_MAX)
		return 0;
	if (negative)
		return -value;
	else
		return value;
}

题三:Palindrome Number

 

判断一个数是不是回文数:

题目里面给的提示是 对于负数直接考虑不是回文,使得问题简单多了。

刚开始我认为负数可以当做回文,怎么提交都出现错误,

从第二题到第三题就很简单了,我仍然用的是将一个整数逆序,只要加一个是不是溢出的判断就可以了。

/*-----------------判断是不是回文数-----------------------*/
/*
如果是负数,直接返回false.
计算过程中,如果逆序之后是溢出的直接返回false.
*/


bool isPalindrome(int x) {
	if (x < 0)
		return false;
	int y = x;
	long long value = 0;
	while (x != 0)
	{
		value = value * 10 + x % 10;
		x /= 10;
	}
	if (value > INT_MAX)
		return false;
	if (y == value)
		return true;
	else
		return false;
}

如果不允许使用reverse整数的话,因为可能导致溢出,那么就可以使用最原始的分离数字的方法,每次分离出最高位最低位,次高位,次地位,进行判断。

/*分离数字方法*/
bool isPalindrome2(int x)
{
	if (x < 0)
		return false;
	if (x < 10)
		return true;
	int count = 0, y=x;
	while (y != 0)
	{
		y /= 10;          //统计位数
		count++;      
	}
	int left = 1;
	int right = pow(10, count);
	while (right>left)
	{
		if (x / right % 10 != x / left % 10)
			return false;
		right /= 10;
		left *= 10;
	}


	return true;
}

未完待续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值