tópico:
29, divida dois números
Dados dois inteiros, dividendo e divisor. Divida dois números sem usar operadores de multiplicação, divisão e mod.
Retorna o quociente obtido dividindo o dividendo pelo divisor.
O resultado da divisão inteira deve ser truncado (truncar) a parte decimal, por exemplo: truncar (8,345) = 8 e truncar (-2,7335) = -2
Exemplo 1:
Entrada: dividendo = 10, divisor = 3
Saída: 3
Explicação: 10/3 = truncar (3.33333…) = truncar (3) = 3
Exemplo 2:
Entrada: dividendo = 7, divisor = -3
Resultado: -2
Explicação: 7 / -3 = truncar (-2,33333…) = -2
incitar:
Tanto o dividendo quanto o divisor são inteiros com sinal de 32 bits.
O divisor não é zero.
Assumindo que nosso ambiente só pode armazenar inteiros com sinal de 32 bits, o intervalo de valores é [−231, 231 - 1]. Nesta questão, se o resultado da divisão estourar, 231 - 1 será retornado.
Ideias para solução de problemas:
A ideia mais simples é tornar os dois números positivos, então o dividendo é continuamente subtraído pelo número até que seja menor que o divisor e, finalmente, o sinal de mais ou menos é adicionado. Você pode usar XOR para determinar se o positivo e o negativo de dois números são iguais, e a única possibilidade de estouro é que o resultado seja igual a 2 ^ 31. Obviamente, esse método atingirá o tempo limite no caso de uso (-2147483648, -1). . .
Sem ideias de tempo limite:
Obviamente, o tempo limite ocorre porque a aproximação dos dois números é muito lenta. Como a divisão não pode ser usada, a subtração deve ser usada apenas para alterar o dividendo, que é muito lento.
Portanto, considere alterar o divisor, você pode continuar a somar, o que é equivalente a multiplicar por 2, e você pode rapidamente aproximar o dividendo.
Por exemplo (100, 2), 2 é adicionado continuamente até 64 e menos de 100, então 100 deve ser subtraído de 64 para obter a aproximação mais rápida e subtrair 64 é equivalente a subtrair 32 2s.
Mas como a divisão não pode ser usada, 32 não é obviamente obtido, portanto, uma variável deve ser inicialmente 1, que é adicionada à medida que o divisor é adicionado para representar o número equivalente de divisores.
Depois de subtrair 64 de 100, o dividendo e o divisor tornam-se (36, 2) e, em seguida, o processo pode ser repetido.
Além disso, há obviamente muitos cálculos repetidos posteriormente, então você pode salvar os valores 4, 8, 16, 32, 64 e os divisores equivalentes no processo e, em seguida, percorrer na ordem inversa.
Código python para solução de problemas:
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
m, n, flag = abs(dividend), abs(divisor), int(dividend^divisor >=0)
d, w = [], 1
while n <= m:
d.append((n, w))
n += n
w += w
res = 0
for n, w in d[::-1]:
if m >= n:
m -= n
res += w
return min([-res, res][flag], 2147483647)
Autor: huozhixue
link: https://leetcode-cn.com/problems/divide-two-integers/solution/python3-jian-ji-by-huozhixue-xgo6/
Fonte: botão de permanência (LeetCode) HTTPS: // leetcode- cn.com/problems/divide-two-integers/