一、题目
实现atoi,将字符串转化乘int类型的数
int myAtoi(string str)函数,返回值为转化后的数,参数为需要转化的str
题目链接:https://leetcode.com/problems/string-to-integer-atoi/description/
二、实现
重点在于string的情况能不能考虑得比较周全
可能考虑不到的情况
1、开头有空格,返回后面的数字,如“ 123”返回123
2、有一个或多个‘+’或‘-’,返回0
3、超过int范围时,大于INT_MAX返回INT_MAX,小于INT_MIN返回INT_MIN
4、如果数字中间有一个非数字字母,返回前面的一部分,如“123e23”返回123
int myAtoi(string str) { long long num = 0; int sign = 1; bool readnum = false; for (auto c : str) { int c_num = 0; if (readnum == false && c == ' ') continue; //判断第一个字母的正负性 if (readnum == false&& (c == '+' || c == '-')) { if (c == '-') sign = -1; readnum = true; continue; } readnum = true; /* switch (c) { case '1':c_num = 1;break; case '2':c_num = 2;break; case '3':c_num = 3;break; case '4':c_num = 4;break; case '5':c_num = 5;break; case '6':c_num = 6;break; case '7':c_num = 7;break; case '8':c_num = 8;break; case '9':c_num = 9;break; case '0':c_num = 0;break; default: return num * sign; } */ if (c >= '0' && c <= '9') c_num = c - '0'; else return num * sign; if ((num * 10 + c_num) * sign > INT_MAX ) return INT_MAX; if ((num * 10 + c_num) * sign < INT_MIN) return INT_MIN; num = num * 10 + c_num; } return num * sign; }
三、本题总结
1、使用long long类型的数先来存取中间结果,在运算前和INT_MAX和INT_MIN进行比较,可以有效防止溢出的情况,在第七题中也用到了这种方式(但是第七题中没有加上尾数,所以情况还没有考虑完善,宁外,判断可以改到循环末尾来做,这样更加简洁)
2、效率问题,使用for(auto i: str)要优于for(int i=0;i<str.size();i++)
3、关于char转成int的方法,最开始使用的是switch,不仅运行速度慢,而且麻烦,实验c-‘0’的方式很方便,关键在于c++语言int和char的关系还是不够熟练。