题目描述
实现 atoi 函数,将以字符串(string)形式表示的整数,转换成整型(int)。
aoti 函数需要满足的条件:
忽略所有行首空格,找到第一个非空格字符,可以是 ‘+/?+/?’ 表示是正数或者负数,紧随其后找到最长的一串连续数字,将其解析成一个整数;
整数后可能有任意非数字字符,请将其忽略;
从前往后遍历时,如果第一段连续数字为空,则返回0;
如果整数大于INT_MAX,请返回int_MAX;如果整数小于INT_MIN,请返回INT_MIN;
思路
题目理解起来不难,就是字符串转换为数字,所用方法类似于上一题,res=res*10+i,但是由于输入的字符串不一定完美,需要排除很多特殊情况,例如首先要除字符串前面的空格,
while(k<str.size()&&(str[k]==' '||str[k]=='\t')) k++;
还要判断前面是否含有±号,并标记符号位,最后将字符串改为数字,并根据符号位乘1或者-1*,最后判断溢出情况,正溢出输出最大的正数,负溢出输出最大的负数。
注意
由于正负数的上线一个是[-2^ 32 ,2^31-1],上下限不同,因此必须先乘符号位分别与最大最小INT比较,否则由于上线不同,则会导致边界判断错误
class Solution {
public:int myAtoi(string str) {
long long res = 0;//最终返回的数int minus = 1;int k =0;//记录移动的当前下标while(k<str.size()&&(str[k]==' '||str[k]=='\t')) k++;//删除空格指表符号if(k>=str.size()) return 0;//空字符串,返回0if(str[k]=='-'){
minus = -1;k++;}//标记符号位else if (str[k]=='+'){
if(minus==-1) return 0;else k++;}while(str[k]>='0'&&str[k]<='9'){
//字符串转数字res=res*10+str[k]-'0';k++;if(res>INT_MAX) break;//溢出,推出循环}res*=minus;if(res>=INT_MAX)//分别判断是否上溢出和下溢出return INT_MAX;if(res<=INT_MIN) return INT_MIN;return res;}
};