Reverse the Digits
Você recebe um número inteiro não negativo n. Retorne o número obtido ao escrever seus dígitos decimais na ordem inversa. Os zeros que ficarem no início são descartados, então 120 se torna 21.
Função
- ninteger
- o inteiro não negativo a ser invertido
- Retornainteger
- os dígitos de n em ordem inversa, como um número
Restrições
0 ≤ n < 109- O número invertido também cabe em um inteiro assinado de 32 bits.
Exemplos
- Entrada
- n = 1234
- Saída
- 4321
- Explicação
- Os dígitos de
1234são 1, 2, 3 e 4. Lidos do fim, são 4, 3, 2 e 1, que formam4321.
- Entrada
- n = 120
- Saída
- 21
- Explicação
- Lendo de trás para frente,
120fornece os dígitos 0, 2 e 1. Um zero à esquerda não conta em um número, então a resposta é21.
- Entrada
- n = 0
- Saída
- 0
- Explicação
0tem um único dígito, e invertê-lo resulta em0novamente.
+13 testes ocultos ao enviar
Para ir além
Se n puder ser qualquer inteiro de 32 bits, seu reverso talvez não caiba. Como você detectaria isso antes que a multiplicação cause um estouro?
Dicas
Abra uma de cada vez. Cada uma revela um pouco mais.
Qual operação aritmética fornece o último dígito de um número, e qual o remove?
n % 10é o último dígito, en / 10(divisão inteira) o remove. Para colocar um dígitodno final de outro númeror, calculer * 10 + d.Comece com
result = 0. Enquantonfor maior que0, mova seu último dígito para o final deresulte remova esse dígito den. Zeros à esquerda nunca aparecem, porque0 * 10 + 0continua sendo0.
Solução
Inverter o texto decimal é feito em uma linha na maioria das linguagens, e essa é uma boa primeira resposta. Os entrevistadores geralmente fazem uma pergunta complementar, pedindo o mesmo resultado sem strings. A versão aritmética se baseia em duas operações: n % 10 lê o último dígito e n / 10 (divisão inteira) o remove.
Inverta o texto decimal
Intuição
Os dígitos de um número são exatamente os caracteres de sua representação decimal em texto. Transforme n em texto, inverta os caracteres e converta o texto de volta em um número. 1234 se torna "1234", depois "4321" e, então, 4321.
Os zeros à esquerda se resolvem sozinhos. Inverter 120 resulta no texto "021", e analisá-lo como um número ignora o zero à esquerda e retorna 21.
Um número menor que 10^9 tem no máximo 9 dígitos, e tanto o trabalho quanto o texto extra crescem com o número de dígitos, o que é O(log n).
Algoritmo
- Converta
nem seu texto decimal. - Inverta os caracteres.
- Interprete o texto invertido como um número inteiro e retorne-o.
def reverseDigits(n):
# int() ignores the leading zeros that trailing zeros turn into.
return int(str(n)[::-1])Remova e adicione dígitos usando operações aritméticas
Intuição
Retire os dígitos do final de n um de cada vez e adicione cada um ao final de um novo número. n % 10 é o último dígito de n, e n / 10 com divisão inteira o remove. Para adicionar um dígito d ao final de result, desloque o que está lá uma casa para a esquerda e coloque d na casa das unidades: result * 10 + d.
Para 1234, result passa por 4, 43, 432, 4321, enquanto n passa por 123, 12, 1, 0. O loop para quando n chega a 0, então é executado uma vez por dígito.
Zeros à esquerda nunca aparecem. Para 120, o primeiro dígito retirado é 0, e 0 * 10 + 0 continua sendo 0, então não deixa vestígios. Para n = 0, o loop nunca é executado e a resposta é 0. Apenas dois inteiros são mantidos, então o espaço extra é O(1).
Algoritmo
- Defina
result = 0. - Enquanto
nfor maior que0, calcule o último dígiton % 10. - Defina
result = result * 10 + digit. - Remova o dígito com
n = n / 10, usando divisão inteira. - Retorne
result.
def reverseDigits(n):
result = 0
while n > 0:
result = result * 10 + n % 10 # push the last digit of n
n //= 10 # drop it from n
return result
Armadilhas e casos extremos
A maioria dos bugs vem da divisão e do fim do loop.
- Usar divisão comum quando você precisa de divisão inteira. Em JavaScript, Python 3 e Lua,
n / 10resulta em123.4, entãonnunca volta a ser um número inteiro eresultfica cheio de frações. UseMath.floor,//ou a divisão inteira da sua linguagem. - Escrever o loop como
while n >= 10. Ele para antes do último dígito, então1234volta como432. - Retornar o texto invertido sem convertê-lo em número.
"021"não é o número21, e a comparação com a resposta esperada falha. - Formatar um double em R com
as.character. Quandoné armazenado como double, ele exibe100000000como1e+08, e o texto invertido é80+e1. Useformat(n, scientific = FALSE).
Perguntas frequentes4
Como inverter os dígitos de um número sem convertê-lo em uma cadeia de caracteres?
Repita duas etapas até que o número seja 0: obtenha o último dígito com n % 10 e acrescente-o ao resultado com result = result * 10 + digit; em seguida, remova-o com n = n / 10, usando divisão inteira. Para 1234, o resultado cresce assim: 4, 43, 432 e 4321.
O que acontece com os zeros à direita quando você inverte um número?
Eles se tornariam zeros à esquerda, que um número não tem, então desaparecem. Inverter 120 resulta em 21, e inverter 100000000 resulta em 1. O loop aritmético os descarta sozinho, porque somar 0 a um resultado vazio o mantém em 0.
Qual é a complexidade de tempo para inverter um número inteiro?
O loop é executado uma vez por dígito decimal, e um número n tem cerca de log10(n) + 1 dígitos, então o tempo é O(log n). A versão aritmética usa espaço extra O(1); a versão com string armazena os dígitos como texto, o que é O(log n).
Inverter um número inteiro pode causar estouro?
Sim, quando a entrada pode ser qualquer inteiro de 32 bits. 1000000009 cabe, mas seu reverso, 9000000001, não. Aqui, n é menor que 10^9, então o reverso tem no máximo 9 dígitos e sempre cabe. Com entradas maiores, verifique result > (INT_MAX - digit) / 10 antes de cada multiplicação.
Problemas parecidos
Problemas que usam as mesmas ideias. Resolver dois ou três é o que fixa um padrão.
Python
def reverseDigits(n):
# Escreva o código aquiCaso 1
Caso 2
Caso 3
Entrada
n = 1234
Esperado
4321