String to Integer (atoi) 字符串转数字

String to Integer (atoi) 字符串转数字

原题地址 主要的难点在于溢出的判断 判断依据: 将极值去掉最后一位(也就是除以10) 来判断,如果数字已经比这个去掉个位的数字要大的话,添上最后一位必会溢出,如果等于的话,比较极值的个位数字与即将添加到个位的数字进行比较,后者大也必定会溢出,否则不会溢出

时间复杂度:O(n) 空间复杂度:O(1)

int myAtoi(string str) {
    if (str.empty()) return 0;

    bool isMinus=false;
    int pos=0;
	// 跳过空格
    while(str[pos] == ' ') ++pos;
	// 正负号检查与跳过
    if (str[pos] == '-' || str[pos] == '+')
        if (str[pos++] == '-') isMinus = true;

    int number=0;
    static int ma = INT_MAX/10;
    static int ma_l = INT_MAX%10;
    static int mi = (unsigned)INT_MIN/10;
    static int mi_l = (unsigned)INT_MIN%10;

	// 开始进行转换
    while(str[pos] >= '0' && str[pos]<='9') {
        int c = str[pos++]-'0';
		// 分别判断上溢和下溢
        if (!isMinus && (number > ma || (number == ma && c>ma_l))) 	{
            return INT_MAX;
        }
		else if
		(isMinus && (number > mi || (number == mi && c > mi_l)))
		{
            return INT_MIN;
        }
        number = 10*number + c;
    }

    return isMinus ? -number : number;
}

如果不想这样判断的话也可以直接用 long 类型来存放 number ,然后直接比较它与 INT_MAXINT_MIN 的大小关系即可

收获

  1. INT_MININT_MAX 两个宏定义在 #include<bits/stdc++.h> 里可以找到
  2. 如何判断溢出

#overflow