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.
Build confidence with an intuition-first walkthrough focused on core interview patterns fundamentals.
Table: Users
+-----------------+---------+ | Column Name | Type | +-----------------+---------+ | user_id | int | | email | varchar | +-----------------+---------+ (user_id) is the unique key for this table. Each row contains a user's unique ID and email address.
Write a solution to find all the valid email addresses. A valid email address meets the following criteria:
@ symbol..com.@ symbol contains only alphanumeric characters and underscores.@ symbol and before .com contains a domain name that contains only letters.Return the result table ordered by user_id in ascending order.
Example:
Input:
Users table:
+---------+---------------------+ | user_id | email | +---------+---------------------+ | 1 | alice@example.com | | 2 | bob_at_example.com | | 3 | charlie@example.net | | 4 | david@domain.com | | 5 | eve@invalid | +---------+---------------------+
Output:
+---------+-------------------+ | user_id | email | +---------+-------------------+ | 1 | alice@example.com | | 4 | david@domain.com | +---------+-------------------+
Explanation:
@, alice is alphanumeric, and example.com starts with a letter and ends with .com.@..com..com.Result table is ordered by user_id in ascending order.
Problem summary: Table: Users +-----------------+---------+ | Column Name | Type | +-----------------+---------+ | user_id | int | | email | varchar | +-----------------+---------+ (user_id) is the unique key for this table. Each row contains a user's unique ID and email address. Write a solution to find all the valid email addresses. A valid email address meets the following criteria: It contains exactly one @ symbol. It ends with .com. The part before the @ symbol contains only alphanumeric characters and underscores. The part after the @ symbol and before .com contains a domain name that contains only letters. Return the result table ordered by user_id in ascending order.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: General problem-solving
{"headers":{"Users":["user_id","email"]},"rows":{"Users":[[1,"alice@example.com"],[2,"bob_at_example.com"],[3,"charlie@example.net"],[4,"david@domain.com"],[5,"eve@invalid"]]}}Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #3436: Find Valid Emails
// Auto-generated Java example from py.
class Solution {
public void exampleSolution() {
}
}
// Reference (py):
// # Accepted solution for LeetCode #3436: Find Valid Emails
// import pandas as pd
//
//
// def find_valid_emails(users: pd.DataFrame) -> pd.DataFrame:
// email_pattern = r"^[A-Za-z0-9_]+@[A-Za-z][A-Za-z0-9]*\.com$"
// valid_emails = users[users["email"].str.match(email_pattern)]
// valid_emails = valid_emails.sort_values(by="user_id")
// return valid_emails
// Accepted solution for LeetCode #3436: Find Valid Emails
// Auto-generated Go example from py.
func exampleSolution() {
}
// Reference (py):
// # Accepted solution for LeetCode #3436: Find Valid Emails
// import pandas as pd
//
//
// def find_valid_emails(users: pd.DataFrame) -> pd.DataFrame:
// email_pattern = r"^[A-Za-z0-9_]+@[A-Za-z][A-Za-z0-9]*\.com$"
// valid_emails = users[users["email"].str.match(email_pattern)]
// valid_emails = valid_emails.sort_values(by="user_id")
// return valid_emails
# Accepted solution for LeetCode #3436: Find Valid Emails
import pandas as pd
def find_valid_emails(users: pd.DataFrame) -> pd.DataFrame:
email_pattern = r"^[A-Za-z0-9_]+@[A-Za-z][A-Za-z0-9]*\.com$"
valid_emails = users[users["email"].str.match(email_pattern)]
valid_emails = valid_emails.sort_values(by="user_id")
return valid_emails
// Accepted solution for LeetCode #3436: Find Valid Emails
// Rust example auto-generated from py reference.
// Replace the signature and local types with the exact LeetCode harness for this problem.
impl Solution {
pub fn rust_example() {
// Port the logic from the reference block below.
}
}
// Reference (py):
// # Accepted solution for LeetCode #3436: Find Valid Emails
// import pandas as pd
//
//
// def find_valid_emails(users: pd.DataFrame) -> pd.DataFrame:
// email_pattern = r"^[A-Za-z0-9_]+@[A-Za-z][A-Za-z0-9]*\.com$"
// valid_emails = users[users["email"].str.match(email_pattern)]
// valid_emails = valid_emails.sort_values(by="user_id")
// return valid_emails
// Accepted solution for LeetCode #3436: Find Valid Emails
// Auto-generated TypeScript example from py.
function exampleSolution(): void {
}
// Reference (py):
// # Accepted solution for LeetCode #3436: Find Valid Emails
// import pandas as pd
//
//
// def find_valid_emails(users: pd.DataFrame) -> pd.DataFrame:
// email_pattern = r"^[A-Za-z0-9_]+@[A-Za-z][A-Za-z0-9]*\.com$"
// valid_emails = users[users["email"].str.match(email_pattern)]
// valid_emails = valid_emails.sort_values(by="user_id")
// return valid_emails
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.