Using greedy without proof
Wrong move: Locally optimal choices may fail globally.
Usually fails on: Counterexamples appear on crafted input orderings.
Fix: Verify with exchange argument or monotonic objective before committing.
Move from brute-force thinking to an efficient approach using greedy strategy.
You are given a very large integer n, represented as a string, and an integer digit x. The digits in n and the digit x are in the inclusive range [1, 9], and n may represent a negative number.
You want to maximize n's numerical value by inserting x anywhere in the decimal representation of n. You cannot insert x to the left of the negative sign.
n = 73 and x = 6, it would be best to insert it between 7 and 3, making n = 763.n = -55 and x = 2, it would be best to insert it before the first 5, making n = -255.Return a string representing the maximum value of n after the insertion.
Example 1:
Input: n = "99", x = 9 Output: "999" Explanation: The result is the same regardless of where you insert 9.
Example 2:
Input: n = "-13", x = 2
Output: "-123"
Explanation: You can make n one of {-213, -123, -132}, and the largest of those three is -123.
Constraints:
1 <= n.length <= 1051 <= x <= 9n are in the range [1, 9].n is a valid representation of an integer.n, it will begin with '-'.Problem summary: You are given a very large integer n, represented as a string, and an integer digit x. The digits in n and the digit x are in the inclusive range [1, 9], and n may represent a negative number. You want to maximize n's numerical value by inserting x anywhere in the decimal representation of n. You cannot insert x to the left of the negative sign. For example, if n = 73 and x = 6, it would be best to insert it between 7 and 3, making n = 763. If n = -55 and x = 2, it would be best to insert it before the first 5, making n = -255. Return a string representing the maximum value of n after the insertion.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Greedy
"99" 9
"-13" 2
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1881: Maximum Value after Insertion
class Solution {
public String maxValue(String n, int x) {
int i = 0;
if (n.charAt(0) == '-') {
++i;
while (i < n.length() && n.charAt(i) - '0' <= x) {
++i;
}
} else {
while (i < n.length() && n.charAt(i) - '0' >= x) {
++i;
}
}
return n.substring(0, i) + x + n.substring(i);
}
}
// Accepted solution for LeetCode #1881: Maximum Value after Insertion
func maxValue(n string, x int) string {
i := 0
y := byte('0' + x)
if n[0] == '-' {
i++
for i < len(n) && n[i] <= y {
i++
}
} else {
for i < len(n) && n[i] >= y {
i++
}
}
return n[:i] + string(y) + n[i:]
}
# Accepted solution for LeetCode #1881: Maximum Value after Insertion
class Solution:
def maxValue(self, n: str, x: int) -> str:
i = 0
if n[0] == "-":
i += 1
while i < len(n) and int(n[i]) <= x:
i += 1
else:
while i < len(n) and int(n[i]) >= x:
i += 1
return n[:i] + str(x) + n[i:]
// Accepted solution for LeetCode #1881: Maximum Value after Insertion
impl Solution {
pub fn max_value(n: String, x: i32) -> String {
let s = n.as_bytes();
let mut i = 0;
if n.starts_with('-') {
i += 1;
while i < s.len() && (s[i] - b'0') as i32 <= x {
i += 1;
}
} else {
while i < s.len() && (s[i] - b'0') as i32 >= x {
i += 1;
}
}
let mut ans = String::new();
ans.push_str(&n[0..i]);
ans.push_str(&x.to_string());
ans.push_str(&n[i..]);
ans
}
}
// Accepted solution for LeetCode #1881: Maximum Value after Insertion
function maxValue(n: string, x: number): string {
let i = 0;
if (n[0] === '-') {
i++;
while (i < n.length && +n[i] <= x) {
i++;
}
} else {
while (i < n.length && +n[i] >= x) {
i++;
}
}
return n.slice(0, i) + x + n.slice(i);
}
Use this to step through a reusable interview workflow for this problem.
Try every possible combination of choices. With n items each having two states (include/exclude), the search space is 2ⁿ. Evaluating each combination takes O(n), giving O(n × 2ⁿ). The recursion stack or subset storage uses O(n) space.
Greedy algorithms typically sort the input (O(n log n)) then make a single pass (O(n)). The sort dominates. If the input is already sorted or the greedy choice can be computed without sorting, time drops to O(n). Proving greedy correctness (exchange argument) is harder than the implementation.
Review these before coding to avoid predictable interview regressions.
Wrong move: Locally optimal choices may fail globally.
Usually fails on: Counterexamples appear on crafted input orderings.
Fix: Verify with exchange argument or monotonic objective before committing.