Enlace: https: //zhuanlan.zhihu.com/p/23967316
Fuente: saber casi con
derechos de autor del autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización. Para reimpresiones no comerciales, indique la fuente.
enlace
https: // leetcode.com/problems/z igzag-conversion /
tema
Ejemplo 1: x = 123, devuelve 321
Ejemplo 2: x = -123, devuelve -321
Las reglas parecen muy simples, pero ¿ha pensado en algunos escenarios especiales?
La persona que hizo la pregunta también es muy consciente, así que primero doblé la pregunta y nos recordé que pensáramos más
Sí, piensa en las escenas especiales y luego mira hacia abajo.
Bueno, si realmente lo has pensado, aquí tienes los consejos para el título:
- Si los últimos bits son 0, ¿cómo debería verse nuestra salida? ¿Como 10100?
- ¿Sabe que el entero invertido puede desbordarse? Si es un entero de 32 bits, su valor máximo es 2147483648, entonces 1000000003 se desbordará después de la inversión. Para este caso, requerimos que la salida sea 0
Definición de función
La definición de función dada por leetcode se ve así:
class Solution {
public:
int reverse(int x) {
}
};
Ideas para resolver problemas
Si no se considera el desbordamiento, es fácil pensar en la idea de este tema:
- Para obtener el número de cada dígito, puede usar operaciones de división de enteros y resto. Debe escribir un bucle, dividiendo por 10 por primera vez y dividiendo por 100 por segunda vez. . .
- Para la secuencia de números resultante, multiplique el primer dígito por 1, el segundo dígito por 10 y el tercer dígito por 100. . . , Y luego sume para obtener el número de inversión
Para el desbordamiento, la forma simple y grosera es ver si intentar ... atrapar ... es adecuado
- Si corresponde, devuelva 0 directamente en la captura.
- Si no es adecuado, tenemos que encontrar el valor máximo del tipo entero
Pseudocódigo
x = 123;
x es el resto de 10 para obtener 3, x se divide por 10 para obtener 12,
12 es para obtener el resto de 10 y x se divide por 10 para obtener 1.
1 es para obtener el resto de 10 para obtener 1, y x se divide por 10 para obtener 0
1 * 1 + 2 * 10 + 3 * 100 = 321
Código
class Solution {
public:
int reverse(int x) {
if (x < 10 && x > -10)
{
return x;
}
vector<int> vecDigits;
int iTemp = x;
do
{
vecDigits.push_back(iTemp % 10);
iTemp = iTemp / 10;
} while (iTemp != 0);
auto iSize = vecDigits.size();
int iFactor = 1;
int iResult = 0;
for (auto i = iSize - 1; i >= 0; --i)
{
iResult += iFactor * vecDigits[i];
iFactor *= 10;
}
return iResult;
}
};
Después de escribir el código, sustituya x = 123 en él para verificar
Bueno, todo se ve bien.
¡Pero cuando lo envío, aparece "Error de tiempo de ejecución"! !
Si no lo entiende, puede volver atrás y mirar la página 34 de la "introducción de c ++"
Sí, hay un bucle sin fin. Tristemente. Cuando estaba leyendo, sentí que no cometería tal error. . .
class Solution {
public:
int reverse(int x) {
if (x < 10 && x > -10)
{
return x;
}
vector<int> vecDigits;
int iTemp = x;
do
{
vecDigits.push_back(iTemp % 10);
iTemp = iTemp / 10;
} while (iTemp != 0);
auto i = vecDigits.size();
int iFactor = 1;
int iResult = 0;
while (i > 0)
{
--i;
iResult += iFactor * vecDigits[i];
iFactor *= 10;
}
return iResult;
}
};
Después de enviar el código para ver, se informa el error de desbordamiento porque no hemos tratado esta situación
Después de cambiar la entrada a un número muy grande, descubrimos que no había ninguna excepción durante el tiempo de ejecución. O use el valor límite para juzgar honestamente
No pensé en una buena solución para este descubrimiento, así que miré el área de discusión.
https: // discus.leetcode.com/to pic / 287 / cómo-manejamos-el-caso-desbordamiento / 12
https: // discus.leetcode.com/to pic / 6005 / shortest -code-possible-in-c
Nos referimos a uno de los códigos modificados
class Solution {
public:
int reverse(int x) {
if (x < 10 && x > -10)
{
return x;
}
vector<int> vecDigits;
int iTemp = x;
do
{
vecDigits.push_back(iTemp % 10);
iTemp = iTemp / 10;
} while (iTemp != 0);
auto i = vecDigits.size();
long long iFactor = 1;
long long iResult = 0;
while (i > 0)
{
--i;
iResult += iFactor * vecDigits[i];
iFactor *= 10;
}
if (iResult > INT_MAX || iResult < INT_MIN)
{
return 0;
}
return iResult;
}
};
Bueno, finalmente aceptado.
Pero mirando el área de discusión, podemos encontrar que los dos bucles se pueden fusionar, esto queda para todos
Además, también puede intentar convertir un número entero en una cadena ~