关于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;
}

未完待续。

时间: 2024-10-08 03:49:26

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

关于leetcode中游戏相关的几道题。

碰到的第一个题就是九宫格的问题, Valid Sudoku determine if a Sudoku is valid, according to: http://sudoku.com.au/TheRules.aspx The Sudoku board could be partially filled, where empty cells are filled with the character '.'. 注意这里合法的九宫格的定义是: 在横行上只出现1-9的数字,且每个数字只能出现1次,

动态规划以及在leetcode中的应用

之前只是知道动态规划是通过组合子问题来解决原问题的,但是如何分析,如何应用一直都是一头雾水.最近在leetcode中发现有好几道题都可以用动态规划方法进行解决,就此做下笔录. 动态规划:应用于子问题重叠情况,原问题的多个子问题间可能含有相同的子子问题,当然,关于将原问题分解成子问题的思路,分治算法也是可行的,但是如果采用分治递归来解决就会出现一些问题.在重复的子问题的计算中,分治算法会忽略到重复问题,也就是说相同的问题,分治算法会计算多次,这样效率会很低.而动态规划算法会仔细安排求解顺序,对每个

用Javascript方式实现LeetCode中的算法(更新中)

前一段时间抽空去参加面试,面试官一开始让我做一道题,他看完之后,让我回答一下这个题的时间复杂度并优化一下,当时的我虽然明白什么是时间复杂度,但不知道是怎么计算的,一开局出师不利,然后没然后了,有一次我逛博客园时看到有个博主的文章说到有LeetCode这玩意,于是就知道了LeetCode.忽然有一种疑问:前端学不学算法?我看过一篇博文:为什么我认为数据结构与算法对前端开发很重要? 我觉得,前端应该是要学一下算法的,不久后前端明朗化,要做的工作量不低于后端人员,到时候也会像优化页面一样去优化js,既

leetcode中第一题twosum问题解答算法的可行性证明

leetcode中第一题twosum问题解答算法的可行性证明 一.引入 关于leetcode中第一题twosum问题,网上已有不少高人做出过解答,并提出了切实可行的算法实现.我在解答该题时参考了博客http://www.zixue7.com/article-9576-1.html的解答.为让读者更直观地阅读和理解本文,先简要摘录以上博客的内容如下: 题目还原 Two Sum Given an array of integers, find two numbers such that they a

leetcode中一些要用到动态规划的题目

需要仔细回顾的题目: 1.Interleaving String   交叉存取字符串 2.Decode Ways   字符串解码 3.Subsets   Subsets II          求一个集合的幂集 leetcode中一些要用到动态规划的题目,布布扣,bubuko.com

leetcode中关于树的dfs算法题

Validate Binary Search Tree Recover Binary Search Tree Symmetric Tree Same Tree Maximum Depth of Binary Tree Construct Binary Tree from Preorder and Inorder Traversal Construct Binary Tree from Inorder and Postorder Traversal Convert Sorted Array to

Leetcode中字符串总结

本文是个人对LeetCode中字符串类型题目的总结,纯属个人感悟,若有不妥的地方,欢迎指出. 一.有关数字 1.数转换 题Interger to roman和Roman to integer这两题是罗马数字和整数之间的相互转换,首先要懂得什么是罗马数字以及相应的组数规则.LeetCode的题中给出的数字最大的是3999,.针对第一题有两种解法:第一是列举出罗马数字在个十百千上的各种情况,形成一个二维矩阵,然后对整数不停的取余.除10来确定相应的罗马数字:第二种是先列出罗马数字组成情况,然后通过从

.Net中使用com组件后发生System.ArithmeticException异常的解决办法(Message=算术运算中发生溢出或下溢。)

最近在开发一个.Net程序,其中涉及到对com组件的调用,或者第三方DLL调用, 在调用完以后如果使用一些小的测试程序继续运行,一切正常,但是在使用带有GUI的form程序,或者WPF程序中,继续执行时,总是出现以下异常Exception: System.ArithmeticExceptionMessage: 算术运算中发生溢出或下溢. "设置属性"System.Windows.FrameworkElement.Height"时引发了异常.",行号为"6&

LeetCode202:Happy Number 。C#版,在vs2010中通过,leetcode中Wrong Answer

static List<int> nums = new List<int>(); public static bool IsHappy(int n) { int newint = 0; while (n != 0) { newint += ((n % 10) * (n % 10)); n = n / 10; } if (newint == 1) return true; if (nums.Contains(newint)) { return false; } else { nums