Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using core interview patterns strategy.
Table: Delivery
+-----------------------------+---------+ | Column Name | Type | +-----------------------------+---------+ | delivery_id | int | | customer_id | int | | order_date | date | | customer_pref_delivery_date | date | +-----------------------------+---------+ delivery_id is the column of unique values of this table. The table holds information about food delivery to customers that make orders at some date and specify a preferred delivery date (on the same order date or after it).
If the customer's preferred delivery date is the same as the order date, then the order is called immediate; otherwise, it is called scheduled.
The first order of a customer is the order with the earliest order date that the customer made. It is guaranteed that a customer has precisely one first order.
Write a solution to find the percentage of immediate orders in the first orders of all customers, rounded to 2 decimal places.
The result format is in the following example.
Example 1:
Input: Delivery table: +-------------+-------------+------------+-----------------------------+ | delivery_id | customer_id | order_date | customer_pref_delivery_date | +-------------+-------------+------------+-----------------------------+ | 1 | 1 | 2019-08-01 | 2019-08-02 | | 2 | 2 | 2019-08-02 | 2019-08-02 | | 3 | 1 | 2019-08-11 | 2019-08-12 | | 4 | 3 | 2019-08-24 | 2019-08-24 | | 5 | 3 | 2019-08-21 | 2019-08-22 | | 6 | 2 | 2019-08-11 | 2019-08-13 | | 7 | 4 | 2019-08-09 | 2019-08-09 | +-------------+-------------+------------+-----------------------------+ Output: +----------------------+ | immediate_percentage | +----------------------+ | 50.00 | +----------------------+ Explanation: The customer id 1 has a first order with delivery id 1 and it is scheduled. The customer id 2 has a first order with delivery id 2 and it is immediate. The customer id 3 has a first order with delivery id 5 and it is scheduled. The customer id 4 has a first order with delivery id 7 and it is immediate. Hence, half the customers have immediate first orders.
Problem summary: Table: Delivery +-----------------------------+---------+ | Column Name | Type | +-----------------------------+---------+ | delivery_id | int | | customer_id | int | | order_date | date | | customer_pref_delivery_date | date | +-----------------------------+---------+ delivery_id is the column of unique values of this table. The table holds information about food delivery to customers that make orders at some date and specify a preferred delivery date (on the same order date or after it). If the customer's preferred delivery date is the same as the order date, then the order is called immediate; otherwise, it is called scheduled. The first order of a customer is the order with the earliest order date that the customer made. It is guaranteed that a customer has precisely one first order. Write a solution to find the percentage of immediate orders in the first orders of all customers,
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: General problem-solving
{"headers":{"Delivery":["delivery_id","customer_id","order_date","customer_pref_delivery_date"]},"rows":{"Delivery":[[1,1,"2019-08-01","2019-08-02"],[2,2,"2019-08-02","2019-08-02"],[3,1,"2019-08-11","2019-08-12"],[4,3,"2019-08-24","2019-08-24"],[5,3,"2019-08-21","2019-08-22"],[6,2,"2019-08-11","2019-08-13"],[7,4,"2019-08-09","2019-08-09"]]}}Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1174: Immediate Food Delivery II
// Auto-generated Java example from rust.
class Solution {
public void exampleSolution() {
}
}
// Reference (rust):
// // Accepted solution for LeetCode #1174: Immediate Food Delivery II
// pub fn sql_example() -> &'static str {
// r#"
// -- Accepted solution for LeetCode #1174: Immediate Food Delivery II
// # Write your MySQL query statement below
// SELECT
// ROUND(AVG(order_date = customer_pref_delivery_date) * 100, 2) AS immediate_percentage
// FROM Delivery
// WHERE
// (customer_id, order_date) IN (
// SELECT customer_id, MIN(order_date)
// FROM Delivery
// GROUP BY 1
// );
// "#
// }
// Accepted solution for LeetCode #1174: Immediate Food Delivery II
// Auto-generated Go example from rust.
func exampleSolution() {
}
// Reference (rust):
// // Accepted solution for LeetCode #1174: Immediate Food Delivery II
// pub fn sql_example() -> &'static str {
// r#"
// -- Accepted solution for LeetCode #1174: Immediate Food Delivery II
// # Write your MySQL query statement below
// SELECT
// ROUND(AVG(order_date = customer_pref_delivery_date) * 100, 2) AS immediate_percentage
// FROM Delivery
// WHERE
// (customer_id, order_date) IN (
// SELECT customer_id, MIN(order_date)
// FROM Delivery
// GROUP BY 1
// );
// "#
// }
# Accepted solution for LeetCode #1174: Immediate Food Delivery II
# Auto-generated Python example from rust.
def example_solution() -> None:
return
# Reference (rust):
# // Accepted solution for LeetCode #1174: Immediate Food Delivery II
# pub fn sql_example() -> &'static str {
# r#"
# -- Accepted solution for LeetCode #1174: Immediate Food Delivery II
# # Write your MySQL query statement below
# SELECT
# ROUND(AVG(order_date = customer_pref_delivery_date) * 100, 2) AS immediate_percentage
# FROM Delivery
# WHERE
# (customer_id, order_date) IN (
# SELECT customer_id, MIN(order_date)
# FROM Delivery
# GROUP BY 1
# );
# "#
# }
// Accepted solution for LeetCode #1174: Immediate Food Delivery II
pub fn sql_example() -> &'static str {
r#"
-- Accepted solution for LeetCode #1174: Immediate Food Delivery II
# Write your MySQL query statement below
SELECT
ROUND(AVG(order_date = customer_pref_delivery_date) * 100, 2) AS immediate_percentage
FROM Delivery
WHERE
(customer_id, order_date) IN (
SELECT customer_id, MIN(order_date)
FROM Delivery
GROUP BY 1
);
"#
}
// Accepted solution for LeetCode #1174: Immediate Food Delivery II
// Auto-generated TypeScript example from rust.
function exampleSolution(): void {
}
// Reference (rust):
// // Accepted solution for LeetCode #1174: Immediate Food Delivery II
// pub fn sql_example() -> &'static str {
// r#"
// -- Accepted solution for LeetCode #1174: Immediate Food Delivery II
// # Write your MySQL query statement below
// SELECT
// ROUND(AVG(order_date = customer_pref_delivery_date) * 100, 2) AS immediate_percentage
// FROM Delivery
// WHERE
// (customer_id, order_date) IN (
// SELECT customer_id, MIN(order_date)
// FROM Delivery
// GROUP BY 1
// );
// "#
// }
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.