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.
Break down a hard problem into reliable checkpoints, edge-case handling, and complexity trade-offs.
Table: logs
+-------------+---------+ | Column Name | Type | +-------------+---------+ | log_id | int | | ip | varchar | | status_code | int | +-------------+---------+ log_id is the unique key for this table. Each row contains server access log information including IP address and HTTP status code.
Write a solution to find invalid IP addresses. An IPv4 address is invalid if it meets any of these conditions:
255 in any octet01.02.03.04)4 octetsReturn the result table ordered by invalid_count, ip in descending order respectively.
The result format is in the following example.
Example:
Input:
logs table:
+--------+---------------+-------------+ | log_id | ip | status_code | +--------+---------------+-------------+ | 1 | 192.168.1.1 | 200 | | 2 | 256.1.2.3 | 404 | | 3 | 192.168.001.1 | 200 | | 4 | 192.168.1.1 | 200 | | 5 | 192.168.1 | 500 | | 6 | 256.1.2.3 | 404 | | 7 | 192.168.001.1 | 200 | +--------+---------------+-------------+
Output:
+---------------+--------------+ | ip | invalid_count| +---------------+--------------+ | 256.1.2.3 | 2 | | 192.168.001.1 | 2 | | 192.168.1 | 1 | +---------------+--------------+
Explanation:
The output table is ordered by invalid_count, ip in descending order respectively.
Problem summary: Table: logs +-------------+---------+ | Column Name | Type | +-------------+---------+ | log_id | int | | ip | varchar | | status_code | int | +-------------+---------+ log_id is the unique key for this table. Each row contains server access log information including IP address and HTTP status code. Write a solution to find invalid IP addresses. An IPv4 address is invalid if it meets any of these conditions: Contains numbers greater than 255 in any octet Has leading zeros in any octet (like 01.02.03.04) Has less or more than 4 octets Return the result table ordered by invalid_count, ip in descending order respectively. The result format is in the following example.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: General problem-solving
{"headers":{"logs":["log_id","ip","status_code"]},"rows":{"logs":[[1,"192.168.1.1",200],[2,"256.1.2.3",404],[3,"192.168.001.1",200],[4,"192.168.1.1",200],[5,"192.168.1",500],[6,"256.1.2.3",404],[7,"192.168.001.1",200]]}}Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #3451: Find Invalid IP Addresses
// Auto-generated Java example from py.
class Solution {
public void exampleSolution() {
}
}
// Reference (py):
// # Accepted solution for LeetCode #3451: Find Invalid IP Addresses
// import pandas as pd
//
//
// def find_invalid_ips(logs: pd.DataFrame) -> pd.DataFrame:
// def is_valid_ip(ip: str) -> bool:
// octets = ip.split(".")
// if len(octets) != 4:
// return False
// for octet in octets:
// if not octet.isdigit():
// return False
// value = int(octet)
// if not 0 <= value <= 255 or octet != str(value):
// return False
// return True
//
// logs["is_valid"] = logs["ip"].apply(is_valid_ip)
// invalid_ips = logs[~logs["is_valid"]]
// invalid_count = invalid_ips["ip"].value_counts().reset_index()
// invalid_count.columns = ["ip", "invalid_count"]
// result = invalid_count.sort_values(
// by=["invalid_count", "ip"], ascending=[False, False]
// )
// return result
// Accepted solution for LeetCode #3451: Find Invalid IP Addresses
// Auto-generated Go example from py.
func exampleSolution() {
}
// Reference (py):
// # Accepted solution for LeetCode #3451: Find Invalid IP Addresses
// import pandas as pd
//
//
// def find_invalid_ips(logs: pd.DataFrame) -> pd.DataFrame:
// def is_valid_ip(ip: str) -> bool:
// octets = ip.split(".")
// if len(octets) != 4:
// return False
// for octet in octets:
// if not octet.isdigit():
// return False
// value = int(octet)
// if not 0 <= value <= 255 or octet != str(value):
// return False
// return True
//
// logs["is_valid"] = logs["ip"].apply(is_valid_ip)
// invalid_ips = logs[~logs["is_valid"]]
// invalid_count = invalid_ips["ip"].value_counts().reset_index()
// invalid_count.columns = ["ip", "invalid_count"]
// result = invalid_count.sort_values(
// by=["invalid_count", "ip"], ascending=[False, False]
// )
// return result
# Accepted solution for LeetCode #3451: Find Invalid IP Addresses
import pandas as pd
def find_invalid_ips(logs: pd.DataFrame) -> pd.DataFrame:
def is_valid_ip(ip: str) -> bool:
octets = ip.split(".")
if len(octets) != 4:
return False
for octet in octets:
if not octet.isdigit():
return False
value = int(octet)
if not 0 <= value <= 255 or octet != str(value):
return False
return True
logs["is_valid"] = logs["ip"].apply(is_valid_ip)
invalid_ips = logs[~logs["is_valid"]]
invalid_count = invalid_ips["ip"].value_counts().reset_index()
invalid_count.columns = ["ip", "invalid_count"]
result = invalid_count.sort_values(
by=["invalid_count", "ip"], ascending=[False, False]
)
return result
// Accepted solution for LeetCode #3451: Find Invalid IP Addresses
// 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 #3451: Find Invalid IP Addresses
// import pandas as pd
//
//
// def find_invalid_ips(logs: pd.DataFrame) -> pd.DataFrame:
// def is_valid_ip(ip: str) -> bool:
// octets = ip.split(".")
// if len(octets) != 4:
// return False
// for octet in octets:
// if not octet.isdigit():
// return False
// value = int(octet)
// if not 0 <= value <= 255 or octet != str(value):
// return False
// return True
//
// logs["is_valid"] = logs["ip"].apply(is_valid_ip)
// invalid_ips = logs[~logs["is_valid"]]
// invalid_count = invalid_ips["ip"].value_counts().reset_index()
// invalid_count.columns = ["ip", "invalid_count"]
// result = invalid_count.sort_values(
// by=["invalid_count", "ip"], ascending=[False, False]
// )
// return result
// Accepted solution for LeetCode #3451: Find Invalid IP Addresses
// Auto-generated TypeScript example from py.
function exampleSolution(): void {
}
// Reference (py):
// # Accepted solution for LeetCode #3451: Find Invalid IP Addresses
// import pandas as pd
//
//
// def find_invalid_ips(logs: pd.DataFrame) -> pd.DataFrame:
// def is_valid_ip(ip: str) -> bool:
// octets = ip.split(".")
// if len(octets) != 4:
// return False
// for octet in octets:
// if not octet.isdigit():
// return False
// value = int(octet)
// if not 0 <= value <= 255 or octet != str(value):
// return False
// return True
//
// logs["is_valid"] = logs["ip"].apply(is_valid_ip)
// invalid_ips = logs[~logs["is_valid"]]
// invalid_count = invalid_ips["ip"].value_counts().reset_index()
// invalid_count.columns = ["ip", "invalid_count"]
// result = invalid_count.sort_values(
// by=["invalid_count", "ip"], ascending=[False, False]
// )
// return result
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.