Inversión entera
Descripción del título
Dado un entero con signo de 32 bits, debe invertir los dígitos en cada dígito de este entero.
Ideas para resolver problemas
Tome un bit para x% 10, el siguiente para x / 10, preste atención a cruzar el límite,
Implementación de código
class Solution {
public:
int reverse(int x) {
int sum = 0;
while(x)
{
if(sum<INT_MIN/10)
return 0;
if(sum>INT_MAX/10)
return 0;
sum=sum*10+x%10;
x/=10;
}
return sum;
}
};
Cadena a entero
Descripción del título
Implemente una función atoi para convertir una cadena en un entero.
Primero, la función descarta los caracteres de espacio iniciales inútiles según sea necesario hasta que se encuentre el primer carácter no espacial.
Cuando el primer carácter no nulo que encontramos es un signo positivo o negativo, el símbolo se combina con tantos dígitos consecutivos como sea posible para ser el signo del entero; si el primer carácter no nulo es El número se combina directamente con los siguientes caracteres numéricos para formar un número entero.
Además de la parte entera válida de la cadena, puede haber caracteres adicionales, estos caracteres pueden ignorarse, no deberían afectar la función.
Nota: Si el primer carácter sin espacio en la cadena no es un carácter entero válido, la cadena está vacía o la cadena contiene solo caracteres en espacio en blanco, entonces su función no necesita ser convertida.
En cualquier caso, si la función no puede realizar una conversión válida, devuelva 0.
Descripción:
Suponiendo que nuestro entorno solo puede almacenar enteros con signo con un tamaño de 32 bits, el rango de valores es [−231, 231 - 1]. Si el valor excede este rango, devuelva INT_MAX (231 - 1) o INT_MIN (−231).
Ideas para resolver problemas
Primer paso
Elimine todos los espacios en la cadena y registre solo los subíndices de caracteres válidos.
Si son todos espacios, devuelva 0 directamente
int length = s.size();
int index = 0;
while(index < length)
{
if(s[length] != ' ')
break;
index++;
}
if(index == length)
return 0;
Segundo paso
Juicio de positivo y negativo, indicado por una marca, inicialmente positivo
int signal = 1;
if(s[index] = '+')
index++;
else if(s[index] = '-')
{
singal = -1;
index++;
}
El tercer paso
Conversión, primero determine si cruza el borde y luego convierta,
int res = 0; //保存结果
while(index<legnth)
{
//1.取一个字符
char Cur = s[index];
//2.判断是否为数字字符
if(Cur < '0' || Cur >'9')
break;
//3.判断是否越界
if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (curChar - '0') > INT_MAX % 10))
{
return INT_MAX;
}
if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (curChar - '0') > -(INT_MIN % 10)))
{
return INT_MIN;
}
//4.转换
res = res*10 + signal*(Cur - '0');
//5.取下一个字符
index++;
}
Implementación de código
class Solution {
public:
int myAtoi(string str) {
unsigned long len = str.length();
int index = 0;
while (index < len) {
if (str[index] != ' ') {
break;
}
index++;
}
//如果全部是空格,直接返回0
if (index == len) {
return 0;
}
int sign = 1;
if (str[index] == '+') {
index++;
} else if (str[index] == '-')
{
sign = -1;
index++;
}
int res = 0;
while (index < len) {
char curChar = str[index];
if (curChar < '0' || curChar > '9') {
break;
}
if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (curChar - '0') > INT_MAX % 10)) {
return INT_MAX;
}
if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (curChar - '0') > -(INT_MIN % 10))) {
return INT_MIN;
}
res = res * 10 + sign * (curChar - '0');
index++;
}
return res;
}
};