剣はOffer67を指します。文字列を整数に変換します

  • トピック:剣はOffer67を参照する文字列を整数に変換します。
    STOIを達成;場合
    、変換はできません、0を返す:①strが④スペースのみ③無番号②空で最初の有効な文字は、記号や数字ではない
    場合値がintRangeを超えた場合は、最初の有効な文字ビット「+」および「-」に従って決定されるINT_MINおよびINT_MAXを返します。符号がない場合は、正の数としてカウントされます。

  • アイデア:
    1。シミュレーショントラバーサル:時間O(n):最大で1回トラバースする必要があります。変換できない場合は、中央のスペースO(1)で終了します。

class Solution {
    
    
public:
    int strToInt(string str) {
    
    
        if (str.empty()) return 0;
        
        int n = str.size();
        int i = 0;
        while (i < n && str[i] == ' ') ++i;//跳过开头空格;
        if (str[i] == ' ') return 0;//str只有空格

        int symbol = 0;//标识正负号
        if (str[i] == '+') {
    
    
            symbol = 1;
            if (++i < n && !(str[i] >= '0' && str[i] <= '9')) return 0;//正负号后面没数字
        } 
        else if (str[i] == '-') {
    
    
            symbol = -1;
            if (++i < n && !(str[i] >= '0' && str[i] <= '9')) return 0;//正负号后面没数字
        }
        else if (str[i] >= '0' && str[i] <= '9') ;
        else return 0; //第一个有效字符不是'+','-',数字
        
        long res = 0;//结果
        int maxVal = INT_MAX;//边界值
        for (; i < n; ++i) {
    
    //初始i一定停在第一个数字上
            if (str[i] >= '0' && str[i] <= '9') {
    
    
                res = res * 10 + (str[i] - '0');
                if (res > maxVal) {
    
    //我们跳过了符号,都是按正数算的,最后再考虑正负号
                    if (symbol == 0 || symbol == 1) return INT_MAX;//没出现+-号就默认按正数算
                    else return INT_MIN;
                } 
            }
            else break;//出现数字以外的其他字符就停止
        }

        return (symbol == 0 || symbol == 1) ? res : (-1) * res;//没出界的int值,根据符号输出正数/负数
    }
};
  • 概要:
    atoiとstoi:違いはパラメーターにあり、stoiパラメーターは文字列、atoiはconst char *ですが、どちらもint、long、long longに変換でき、i、l、llに変更するだけです。

おすすめ

転載: blog.csdn.net/jiuri1005/article/details/114496773