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

来源:互联网 发布:java光标变粗 编辑:程序博客网 时间:2024/05/16 15:09

题目概述


解题思路

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

这道题目就是让模拟实现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;//跳过开始的空格和字符0char 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);elsehasSimbol = 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;}



0 0