Сложность: medium
Даны два целых числа, представляющих числитель и знаменатель дроби. Верните дробь в строковом формате.
Если дробная часть повторяется, заключите повторяющуюся часть в скобки.
Если возможны несколько ответов, верните любой из них.
Гарантируется, что длина строки ответа будет меньше 10^4 для всех предоставленных входных данных.
Пример:
Input: numerator = 1, denominator = 2
Output: "0.5"
👨💻 Алгоритм:
1⃣Использование хеш-таблицы для отслеживания остатков:
Создайте хеш-таблицу для хранения соответствия между остатком от деления и его позицией в дробной части. Это поможет определить начало повторяющейся части.
Для каждого нового остатка вычислите следующую цифру результата деления и проверьте, был ли такой остаток уже получен ранее.
2⃣Обработка нулевого остатка:
Если в процессе деления остаток становится равным нулю, это означает, что дробная часть не повторяется и процесс можно завершать.
3⃣Учет особенностей:
Будьте осторожны с крайними случаями, такими как отрицательные дроби или особо сложные случаи, например, деление −1 на −2147483648. В этих случаях следует корректно обрабатывать знаки и возможные переполнения.
😎 Решение:
class Solution {
func fractionToDecimal(_ numerator: Int, _ denominator: Int) -> String {
if numerator == 0 {
return "0"
}
var fraction = ""
if (numerator < 0) != (denominator < 0) {
fraction += "-"
}
let dividend = abs(numerator)
let divisor = abs(denominator)
fraction += "\(dividend / divisor)"
var remainder = dividend % divisor
if remainder == 0 {
return fraction
}
fraction += "."
var lookup = [Int: Int]()
while remainder != 0 {
if let pos = lookup[remainder] {
fraction.insert(contentsOf: "(", at: fraction.index(fraction.startIndex, offsetBy: pos))
fraction += ")"
break
}
lookup[remainder] = fraction.count
remainder *= 10
fraction += "\(remainder / divisor)"
remainder %= divisor
}
return fraction
}
}Ставь 👍 и забирай 📚 Базу знаний