Банковские счета
Вы решили задачу. Теперь можно сравнить подходы.
Словарь связывает имя клиента с целочисленным балансом.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Словарь балансов
Обычные операции меняют один-два баланса. Для INCOME обходим открытые счета; целочисленная формула не теряет точность. Перевод самому себе тоже работает.
import sys
accounts = {}
for line in sys.stdin:
parts = line.split()
if not parts:
continue
command = parts[0]
if command == 'BALANCE':
print(accounts.get(parts[1], 'ERROR'))
elif command == 'INCOME':
p = int(parts[1])
for name, balance in accounts.items():
if balance > 0:
accounts[name] += balance * p // 100
elif command == 'TRANSFER':
source, target, amount = parts[1], parts[2], int(parts[3])
accounts[source] = accounts.get(source, 0) - amount
accounts[target] = accounts.get(target, 0) + amount
else:
name, amount = parts[1], int(parts[2])
if command == 'WITHDRAW':
amount = -amount
accounts[name] = accounts.get(name, 0) + amount
Время: Ожидаемое O(Q + IC), Q — число команд, I — число начислений, C — число клиентов. Память: O(C + L), L — длина текущей команды.
Другой способ: Список счетов и линейный поиск
Параллельные списки демонстрируют тот же учёт без хеш-таблицы. Поиск имени требует линейного прохода, поэтому для больших данных предпочтителен словарь.
import sys
names, balances = [], []
def account(name):
if name not in names:
names.append(name)
balances.append(0)
return names.index(name)
for line in sys.stdin:
p = line.split()
if not p:
continue
if p[0] == 'BALANCE':
print(balances[names.index(p[1])] if p[1] in names else 'ERROR')
elif p[0] == 'INCOME':
rate = int(p[1])
for i in range(len(names)):
if balances[i] > 0:
balances[i] += balances[i] * rate // 100
elif p[0] == 'TRANSFER':
i, j = account(p[1]), account(p[2])
balances[i] -= int(p[3])
balances[j] += int(p[3])
else:
i = account(p[1])
balances[i] += int(p[2]) * (1 if p[0] == 'DEPOSIT' else -1)
Время: O(QC). Память: O(C + L).
На что обратить внимание
- BALANCE не создаёт счёт.
- Проценты начисляются только положительным балансам.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.