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.
Given an array of functions [f1, f2, f3, ..., fn], return a new function fn that is the function composition of the array of functions.
The function composition of [f(x), g(x), h(x)] is fn(x) = f(g(h(x))).
The function composition of an empty list of functions is the identity function f(x) = x.
You may assume each function in the array accepts one integer as input and returns one integer as output.
Example 1:
Input: functions = [x => x + 1, x => x * x, x => 2 * x], x = 4 Output: 65 Explanation: Evaluating from right to left ... Starting with x = 4. 2 * (4) = 8 (8) * (8) = 64 (64) + 1 = 65
Example 2:
Input: functions = [x => 10 * x, x => 10 * x, x => 10 * x], x = 1 Output: 1000 Explanation: Evaluating from right to left ... 10 * (1) = 10 10 * (10) = 100 10 * (100) = 1000
Example 3:
Input: functions = [], x = 42 Output: 42 Explanation: The composition of zero functions is the identity function
Constraints:
-1000 <= x <= 10000 <= functions.length <= 1000Problem summary: Given an array of functions [f1, f2, f3, ..., fn], return a new function fn that is the function composition of the array of functions. The function composition of [f(x), g(x), h(x)] is fn(x) = f(g(h(x))). The function composition of an empty list of functions is the identity function f(x) = x. You may assume each function in the array accepts one integer as input and returns one integer as output.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: General problem-solving
[x => x + 1, x => x * x, x => 2 * x] 4
[x => 10 * x, x => 10 * x, x => 10 * x] 1
[] 42
memoize)counter)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #2629: Function Composition
// Auto-generated Java example from ts.
class Solution {
public void exampleSolution() {
}
}
// Reference (ts):
// // Accepted solution for LeetCode #2629: Function Composition
// type F = (x: number) => number;
//
// function compose(functions: F[]): F {
// return function (x) {
// return functions.reduceRight((acc, fn) => fn(acc), x);
// };
// }
//
// /**
// * const fn = compose([x => x + 1, x => 2 * x])
// * fn(4) // 9
// */
// Accepted solution for LeetCode #2629: Function Composition
// Auto-generated Go example from ts.
func exampleSolution() {
}
// Reference (ts):
// // Accepted solution for LeetCode #2629: Function Composition
// type F = (x: number) => number;
//
// function compose(functions: F[]): F {
// return function (x) {
// return functions.reduceRight((acc, fn) => fn(acc), x);
// };
// }
//
// /**
// * const fn = compose([x => x + 1, x => 2 * x])
// * fn(4) // 9
// */
# Accepted solution for LeetCode #2629: Function Composition
# Auto-generated Python example from ts.
def example_solution() -> None:
return
# Reference (ts):
# // Accepted solution for LeetCode #2629: Function Composition
# type F = (x: number) => number;
#
# function compose(functions: F[]): F {
# return function (x) {
# return functions.reduceRight((acc, fn) => fn(acc), x);
# };
# }
#
# /**
# * const fn = compose([x => x + 1, x => 2 * x])
# * fn(4) // 9
# */
// Accepted solution for LeetCode #2629: Function Composition
// Rust example auto-generated from ts 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 (ts):
// // Accepted solution for LeetCode #2629: Function Composition
// type F = (x: number) => number;
//
// function compose(functions: F[]): F {
// return function (x) {
// return functions.reduceRight((acc, fn) => fn(acc), x);
// };
// }
//
// /**
// * const fn = compose([x => x + 1, x => 2 * x])
// * fn(4) // 9
// */
// Accepted solution for LeetCode #2629: Function Composition
type F = (x: number) => number;
function compose(functions: F[]): F {
return function (x) {
return functions.reduceRight((acc, fn) => fn(acc), x);
};
}
/**
* const fn = compose([x => x + 1, x => 2 * x])
* fn(4) // 9
*/
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.