Lituo 8. Convertir cadena a entero (atoi) 15 líneas de código C++ minimalista se pueden recorrer en una sola pasada

Tema
Implemente una función myAtoi(string s) que convierta una cadena en un entero con signo de 32 bits (similar a la función atoi en C/C++).

El algoritmo de la función myAtoi(string s) es el siguiente:

1. Lea la cadena y deseche los espacios iniciales inútiles.
2. Compruebe si el siguiente carácter (suponiendo que no sea el final del carácter) es un signo más o menos, lea ese carácter (si lo hay). Determina si el resultado final es negativo o positivo. Si ninguno está presente, se supone que el resultado es positivo.
3. Lea el siguiente carácter hasta que se alcance el siguiente carácter no numérico o se alcance el final de la entrada. El resto de la cadena será ignorada.
4. Convierta estos números leídos de los pasos anteriores en números enteros (es decir, "123" -> 123, "0032" -> 32). El número entero es 0 si no se leyó ningún número. Cambie los símbolos si es necesario (desde el paso 2).
5. Si el número de enteros excede el rango de enteros con signo de 32 bits [−2^31, 2^31 − 1], el entero debe truncarse para mantenerlo dentro de este rango. Específicamente, los enteros menores que −2^31 deben fijarse en −2^31 y los enteros mayores que 2^31 − 1 deben fijarse en 2^31 − 1 .
6. Devuelva el número entero como resultado final.

Nota:
Los caracteres en blanco en esta pregunta solo incluyen el carácter de espacio ' '.
No omita ningún carácter que no sean los espacios iniciales o el resto de la cadena después de los números.

Ejemplo 1:

输入:s = "42"
输出:42
解析得到整数 42 。
由于 "42" 在范围 [-2^31, 2^31 - 1] 内,最终结果为 42 。

Ejemplo 2:

输入:s = "   -42"
输出:-42
解析得到整数 -42 。
由于 "-42" 在范围 [-2^31, 2^31 - 1] 内,最终结果为 -42 。

Ejemplo 3:

输入:s = "4193 with words"
输出:4193
解析得到整数 4193 。
由于 "4193" 在范围 [-2^31, 2^31 - 1] 内,最终结果为 4193 。

pista:

0 <= s.length <= 200
s consta de letras inglesas (mayúsculas y minúsculas), números (0-9), ' ', '+', '-' y '.'

código:

int myAtoi(string s) {
    while(s!=""&&s[0]==' ') s.erase(0,1);
    if(s=="") return 0;
    bool negative=s[0]=='-'?true:false;
    if(negative||s[0]=='+') s.erase(0,1);
    if(s=="") return 0;
    auto it=s.begin();
    long long s_long=0;
    for(auto it=s.begin();it!=s.end()&&(*it)-'0'>=0&&(*it)-'0'<=9;++it){
        s_long*=10;
        s_long+=(*(it)-'0');
        if(s_long>(long long)INT_MAX||s_long<(long long)INT_MIN) return negative?INT_MIN:INT_MAX;
    }
    return negative?-s_long:s_long;
 }

El uso de funciones de biblioteca se minimiza durante todo el proceso y solo se utiliza la función de borrado que viene con la cadena.

Supongo que te gusta

Origin blog.csdn.net/weixin_43739821/article/details/129997344
Recomendado
Clasificación