【面试题】剑指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
- 【面试题】剑指Offer-49-模拟实现atoi()函数
- 剑指offer面试题49atoi函数的编写
- 面试题atoi的模拟实现
- leetcode 8: String to Integer (myAtoi,C库函数atoi模拟) (剑指offer 面试题49) 解题报告
- 【面试题】剑指Offer-11-模拟实现Pow
- 剑指offer——面试题49:不使用atoi库函数实现把字符串转换成整数
- atoi函数的大概实现【剑指offer】
- 剑指offer中atoi()函数的实现
- 模拟实现atoi函数
- 模拟实现atoi函数
- 模拟实现atoi函数
- 模拟实现atoi函数
- 模拟实现atoi函数
- 模拟实现atoi函数
- 模拟实现atoi函数
- 模拟实现atoi函数
- 模拟实现atoi函数
- 一道经典面试题,atoi函数的实现
- Caffe学习笔记(七):使用训练好的model做预测(mnist)
- Mike and strings-codeforces-Round 410-Div2-B
- 利用spring-security解决CSRF问题
- linux下QT5.6.2连接MYSQL过程
- h4183最大流
- 【面试题】剑指Offer-49-模拟实现atoi()函数
- PHP,AJAX,ASP,ADO
- 期待
- 编译SSD caffe出错
- jQuery清空table表格除首行外的所有数据(ajax+ js实现动态画表及刷新数据)
- springmvc静态资源访问
- 38-连接断开异常(服务器进程终止)
- Linux内核Makefile分析
- iOS开发网络篇—数据缓存