【面试题】剑指Offer-49-模拟实现atoi()函数

题目概述


解题思路

就像本篇博文的题目所介绍的那样

这道题目就是让模拟实现atoi函数

结合库中的atoi函数,我们需要处理的情况有以下几种

各种情况分析

情况1:正常情况,给的字符串“123”,在正常的范围内

情况2:字符串为空

情况3:传入的数字为负数

情况4:字符串中间有异常字符的情况

情况5:字符串越界的情况

情况6:字符串开头有空格的情况

情况7:字符串开头有0的情况

对于上述这些情况,我们可以根据库函数的标准来模拟

也可以自己定义处理规则

我是用C++实现的,用了string类来保存字符串

atoi库函数是用过一个全局变量来保存是否输入非法的情况,如果非法,则返回值为0,这时就需要这个全局变量来观察是否是异常的0

而C++中可以用异常处理机制来处理错误的情况,我这里是用了pair结构体

结构体的第一个值代表是否转换成功,第二个值代表转换的结果

如果转换失败,则第二个值为0

代码实现

#include<iostream>
using namespace std;
#include<string>
pair<bool,long long> my_atoi(string& s)
{
	if (s.empty())
		return make_pair(false,0);

	bool hasSimbol = true;

	//跳过开始的空格和字符0
	char fC = s[0];
	int endIndex = 0;
	for (int i = 0; i < s.size(); ++i)
	{
		fC = s[i];
		endIndex = i;
		if (fC != ' ' && fC != '0')
			break;
	}
	
	//判断有无符号位
	if (fC != '+' && fC != '-')
	{
		//第一个字符不为正负号,也不为数字
		//否则,将符号位置为FALSE,代表没有符号位
		if ((fC < '0') && (fC > '9'))
			return make_pair(false, 0);
		else
			hasSimbol = false;
	}

	long long ret = 0;
	int len = s.size();
	int index = len - 1;
	long long base = 1;
	for (; index >= endIndex; index--)
	{
		if (index == endIndex && hasSimbol)
			break;

		char tmp = s[index];
		if (tmp < '0' || tmp > '9')
			return make_pair(false, 0);

		ret += (tmp - '0')*base;
		base *= 10;

		//判断是否越界

		if (fC == '-')
		{
			if (ret < (signed int)0x80000000)
				return make_pair(false, 0);
		}
		else
		{
			if (ret > 0x7FFFFFFF)
				return make_pair(false, 0);
		}
	}

	if (hasSimbol)
	{
		if (fC == '-')
			ret = (-ret);
	}

	return make_pair(true,ret);
} 

void TestMyAtoi()
{
	//测试正常情况
	string s1("123");
	pair<bool,long long> ret = my_atoi(s1);
	cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;

	//测试字符串为空的情况
	string s2;
	my_atoi(s2);
	ret = my_atoi(s2);
	cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;

	//测试字符串的前面有负号的情况
	string s3("-123");
	my_atoi(s3);
	ret = my_atoi(s3);
	cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;

	//测试字符串中间不符合的情况
	string s4("-1v3");
	my_atoi(s4);
	ret = my_atoi(s4);
	cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;

	//测试字符串越界的情况
	string s5("55555555555555555555555555555555555555");
	my_atoi(s5);
	ret = my_atoi(s5);
	cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;

	string s6("  123");
	my_atoi(s6);
	ret = my_atoi(s6);
	cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;

	string s7("  -123");
	my_atoi(s7);
	ret = my_atoi(s7);
	cout << "是否正常:" << ret.first << " 结果: " << ret.second << endl;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值