Interview questions · Mercor
Currency Exchange Rate Between Two Currencies via Chained Conversions
Given a list of pairwise currency exchange rates such as USD to GBP at 0.77, compute the rate from a source currency to a target currency, converting through intermediate currencies and using rates in reverse where needed. It tests reasoning about chained conversions, unknown or unreachable currencies, and a clear time and space complexity analysis.
You are given a table of currency exchange rates. Each entry [from, to, rate] means that 1 unit of currency from is worth rate units of currency to. For example, ["USD", "GBP", 0.77] means that 1 USD equals 0.77 GBP.
Given a source currency and a target currency, return the exchange rate from source to target: how many units of target 1 unit of source is worth. The table may not list the pair directly, so a conversion can pass through one or more intermediate currencies.
In the interview this was an algorithm round without code, so be ready to explain your approach and its time and space complexity.
Function Signature
def exchange_rate(rates: list[tuple[str, str, float]], source: str, target: str) -> float:
Rules
- Each entry is a triple
(from, to, rate); the examples write entries as lists. - Every entry can be used in both directions:
[A, B, r]also means that 1Bequals1 / runits ofA. - Converting through intermediate currencies multiplies the rates along the way: if 1
Aequalsxunits ofBand 1Bequalsyunits ofC, then 1Aequalsx * yunits ofC. - The table is consistent: every chain of conversions between the same two currencies gives the same rate, apart from floating-point rounding. The exact answer is therefore unique.
- If
source == target, return1.0, even when that currency does not appear in the table. - Otherwise, if no chain of entries connects
sourcetotarget, including when either currency does not appear in the table, return-1.0. - A positive answer is accepted when its relative error from the exact rate is at most
1e-6.-1.0must be returned exactly when no conversion exists.
Constraints
0 <= len(rates) <= 10000- Every currency code, including
sourceandtarget, is a string of 3 uppercase English letters. - In every entry
from != to, and each unordered pair of currencies appears in at most one entry. 1e-3 <= rate <= 1e3for every entry.- The exact rate between any two connected currencies lies between
1e-9and1e9, so no intermediate product overflows or underflows a 64-bit float.
Examples
Example 1
Input: rates = [["USD", "GBP", 0.77], ["GBP", "EUR", 1.2]], source = "USD", target = "EUR"
Output: 0.924
1 USD equals 0.77 GBP and 1 GBP equals 1.2 EUR, so 1 USD equals 0.77 * 1.2 = 0.924 EUR. A floating-point result that differs from 0.924 only in the last digits is accepted.
Example 2
Input: rates = [["USD", "GBP", 0.77], ["GBP", "EUR", 1.2]], source = "EUR", target = "USD"
Output: 1.082251
The chain runs backward, so each rate is inverted: 1 EUR equals 1 / 1.2 GBP, and 1 GBP equals 1 / 0.77 USD. The exact rate is 1 / 0.924 = 250 / 231, shown here rounded to six decimal places.
Example 3
Input: rates = [["USD", "GBP", 0.77], ["JPY", "KRW", 9.5]], source = "USD", target = "KRW"
Output: -1.0
USD and GBP are connected only to each other, and JPY and KRW only to each other, so no chain of entries reaches KRW from USD.
Community answers
Nothing here yet.
Join in on CSWork →