Ramp

Ramp Software Engineer Phone Screen Questions

9+ questions from real Ramp Software Engineer Phone Screen rounds, reported by candidates who interviewed there.

9
Questions
5
Topic Areas
10+
Sources

What does the Ramp Phone Screen round test?

The Ramp phone screen typically lasts 45-60 minutes and evaluates core Software Engineer fundamentals. Candidates should expect 1-2 algorithmic problems, basic system design discussion at senior levels, and questions about relevant experience. The goal is to confirm technical competence before bringing candidates onsite.

Top Topics in This Round

Ramp Software Engineer Phone Screen Questions

This question has appeared before. This question bank is probably quite small. Given a set of flight information, each flight includes: departure airport, departure time, arrival airport, arrival time

Has anyone interviewed with Ramp? I heard there is a codesignal OA and a Hireflix video interview? Can anyone share some detail?

I recently got an invite to the first technical phone screen round for Ramp's frontend engineer intern position, and I really want to give it my best shot. All I heard from a recruiter is they don't t

## Problem Implement calendar operations such as event scheduling, conflict detection, or free time finding. ## Likely LeetCode equivalent No direct unambiguous match. ## Tags arrays, sorting, greedy

## Problem Render or compute a calendar view layout for a set of events, handling overlaps and display constraints. ## Likely LeetCode equivalent No direct match with high confidence. ## Tags arrays, sorting, coding_other

## Round 1 - Coding ## Problem Given the contents of a CSV file as a string, implement a query engine that supports `SELECT`, `WHERE` (with `=` and `>` conditions), and `ORDER BY`. No external CSV or database libraries allowed. ```python class CSVQuery: def __init__(self, csv_data: str): ... def select(self, columns: list[str]) -> list[dict]: ... def where(self, column: str, op: str, value: str) -> 'CSVQuery': # op: "=", ">", "<" ... def order_by(self, column: str, ascending: bool = True) -> 'CSVQuery': ... def execute(self) -> list[dict]: ... ``` ## Example ``` csv = """name,age,dept Alice,30,Eng Bob,25,Sales Carol,35,Eng""" q = CSVQuery(csv) result = q.where("dept", "=", "Eng").order_by("age").select(["name","age"]).execute() # -> [{"name":"Alice","age":"30"},{"name":"Carol","age":"35"}] ``` ## Follow-ups 1. How do you handle quoted fields that contain commas, e.g. `"Smith, John"`? 2. How would you support numeric comparison for integer and float columns? 3. Add support for `LIMIT N` — where in the chain does it apply? 4. How would you handle missing or empty values in a column used for sorting or filtering?

## Round 1 - Coding ## Problem Implement a command-line currency converter. The CLI accepts commands to set exchange rates, convert amounts, and query conversion chains (convert through an intermediate currency if a direct rate isn't available). ```python class CurrencyCLI: def set_rate(self, from_curr: str, to_curr: str, rate: float) -> None: ... def convert(self, amount: float, from_curr: str, to_curr: str) -> float: # returns -1.0 if conversion is impossible ... def best_rate(self, from_curr: str, to_curr: str) -> float: # returns the effective rate via the best available path ... ``` ## Example ``` cli = CurrencyCLI() cli.set_rate("USD", "EUR", 0.92) cli.set_rate("EUR", "GBP", 0.86) cli.convert(100, "USD", "EUR") -> 92.0 cli.convert(100, "USD", "GBP") -> 79.12 # USD->EUR->GBP cli.convert(100, "USD", "JPY") -> -1.0 # no path cli.best_rate("USD", "GBP") -> 0.7912 ``` ## Follow-ups 1. Rates are bidirectional — if USD->EUR is 0.92, what is EUR->USD? How do you store both? 2. How do you find the path that maximizes the converted amount (best rate) rather than any valid path? 3. How do you detect arbitrage opportunities (a cycle where converting back yields more than you started)? 4. How would you cache rates with a TTL so stale rates expire after 60 seconds?

## Round 1 - Coding ## Problem Implement a flight tracking system. Flights have a status that updates over time. Support querying all flights by origin, destination, or status. Also return any flights currently delayed. ```python class FlightTracker: def add_flight(self, flight_id: str, origin: str, dest: str, departure: str, arrival: str) -> None: ... def update_status(self, flight_id: str, status: str, delay_minutes: int = 0) -> None: # status: "on_time", "delayed", "landed", "cancelled" ... def get_delayed(self) -> list[str]: # returns flight_ids ... def flights_from(self, origin: str) -> list[dict]: ... def flights_to(self, dest: str) -> list[dict]: ... ``` ## Example ``` tracker = FlightTracker() tracker.add_flight("AA100", "JFK", "LAX", "08:00", "11:30") tracker.add_flight("UA200", "ORD", "LAX", "09:00", "12:00") tracker.update_status("AA100", "delayed", 45) tracker.get_delayed() -> ["AA100"] tracker.flights_to("LAX") -> [{"id":"AA100",...},{"id":"UA200",...}] ``` ## Follow-ups 1. How do you efficiently query all flights originating from a given airport if you have 10,000 flights? 2. If a flight status changes multiple times, how do you maintain a history of state transitions? 3. How would you alert subscribers when a specific flight's status changes? 4. Design the schema to store this in a relational database. Which columns would you index?

## Round 1 - Coding ## Problem Implement a subscription tracking system. Users subscribe to plans with monthly prices. Mid-cycle plan changes are prorated. Compute the total bill for a user at the end of each month. ```python class SubscriptionTracker: def subscribe(self, user_id: str, plan: str, price_per_month: float, start_day: int) -> None: ... def change_plan(self, user_id: str, new_plan: str, new_price: float, change_day: int) -> None: ... def cancel(self, user_id: str, cancel_day: int) -> None: ... def monthly_bill(self, user_id: str, days_in_month: int) -> float: ... ``` ## Example ``` tracker = SubscriptionTracker() tracker.subscribe("u1", "basic", 30.0, start_day=1) tracker.monthly_bill("u1", days_in_month=30) -> 30.0 tracker.subscribe("u2", "basic", 30.0, start_day=1) tracker.change_plan("u2", "pro", 60.0, change_day=16) # Day 1-15: basic @ 30/30 * 15 = 15.00 # Day 16-30: pro @ 60/30 * 15 = 30.00 tracker.monthly_bill("u2", days_in_month=30) -> 45.0 ``` ## Follow-ups 1. How do you handle a user who cancels mid-month — do they get a refund or not? 2. How would you support annual subscriptions with monthly billing breakdowns? 3. What data structure tracks multiple plan changes within a single month? 4. How do you generate an invoice line-item breakdown instead of just the total?

See All 9 Questions from This Round

Full question text, answer context, and frequency data for subscribers.

Get Access