Overflow in intermediate arithmetic
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.
Move from brute-force thinking to an efficient approach using math strategy.
There are three stones in different positions on the X-axis. You are given three integers a, b, and c, the positions of the stones.
In one move, you pick up a stone at an endpoint (i.e., either the lowest or highest position stone), and move it to an unoccupied position between those endpoints. Formally, let's say the stones are currently at positions x, y, and z with x < y < z. You pick up the stone at either position x or position z, and move that stone to an integer position k, with x < k < z and k != y.
The game ends when you cannot make any more moves (i.e., the stones are in three consecutive positions).
Return an integer array answer of length 2 where:
answer[0] is the minimum number of moves you can play, andanswer[1] is the maximum number of moves you can play.Example 1:
Input: a = 1, b = 2, c = 5 Output: [1,2] Explanation: Move the stone from 5 to 3, or move the stone from 5 to 4 to 3.
Example 2:
Input: a = 4, b = 3, c = 2 Output: [0,0] Explanation: We cannot make any moves.
Example 3:
Input: a = 3, b = 5, c = 1 Output: [1,2] Explanation: Move the stone from 1 to 4; or move the stone from 1 to 2 to 4.
Constraints:
1 <= a, b, c <= 100a, b, and c have different values.Problem summary: There are three stones in different positions on the X-axis. You are given three integers a, b, and c, the positions of the stones. In one move, you pick up a stone at an endpoint (i.e., either the lowest or highest position stone), and move it to an unoccupied position between those endpoints. Formally, let's say the stones are currently at positions x, y, and z with x < y < z. You pick up the stone at either position x or position z, and move that stone to an integer position k, with x < k < z and k != y. The game ends when you cannot make any more moves (i.e., the stones are in three consecutive positions). Return an integer array answer of length 2 where: answer[0] is the minimum number of moves you can play, and answer[1] is the maximum number of moves you can play.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Math
1 2 5
4 3 2
3 5 1
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1033: Moving Stones Until Consecutive
class Solution {
public int[] numMovesStones(int a, int b, int c) {
int x = Math.min(a, Math.min(b, c));
int z = Math.max(a, Math.max(b, c));
int y = a + b + c - x - z;
int mi = 0, mx = 0;
if (z - x > 2) {
mi = y - x < 3 || z - y < 3 ? 1 : 2;
mx = z - x - 2;
}
return new int[] {mi, mx};
}
}
// Accepted solution for LeetCode #1033: Moving Stones Until Consecutive
func numMovesStones(a int, b int, c int) []int {
x := min(a, min(b, c))
z := max(a, max(b, c))
y := a + b + c - x - z
mi, mx := 0, 0
if z-x > 2 {
mi = 2
if y-x < 3 || z-y < 3 {
mi = 1
}
mx = z - x - 2
}
return []int{mi, mx}
}
# Accepted solution for LeetCode #1033: Moving Stones Until Consecutive
class Solution:
def numMovesStones(self, a: int, b: int, c: int) -> List[int]:
x, z = min(a, b, c), max(a, b, c)
y = a + b + c - x - z
mi = mx = 0
if z - x > 2:
mi = 1 if y - x < 3 or z - y < 3 else 2
mx = z - x - 2
return [mi, mx]
// Accepted solution for LeetCode #1033: Moving Stones Until Consecutive
struct Solution;
impl Solution {
fn num_moves_stones(a: i32, b: i32, c: i32) -> Vec<i32> {
let mut a: Vec<i32> = vec![a, b, c];
a.sort_unstable();
let min = if a[0] + 1 == a[1] && a[1] + 1 == a[2] {
0
} else {
if a[0] + 2 >= a[1] || a[1] + 2 >= a[2] {
1
} else {
2
}
};
let max = a[1] - a[0] - 1 + a[2] - a[1] - 1;
vec![min, max]
}
}
#[test]
fn test() {
let a = 1;
let b = 2;
let c = 5;
let res = vec![1, 2];
assert_eq!(Solution::num_moves_stones(a, b, c), res);
let a = 4;
let b = 3;
let c = 2;
let res = vec![0, 0];
assert_eq!(Solution::num_moves_stones(a, b, c), res);
let a = 3;
let b = 5;
let c = 1;
let res = vec![1, 2];
assert_eq!(Solution::num_moves_stones(a, b, c), res);
}
// Accepted solution for LeetCode #1033: Moving Stones Until Consecutive
function numMovesStones(a: number, b: number, c: number): number[] {
const x = Math.min(a, Math.min(b, c));
const z = Math.max(a, Math.max(b, c));
const y = a + b + c - x - z;
let mi = 0,
mx = 0;
if (z - x > 2) {
mi = y - x < 3 || z - y < 3 ? 1 : 2;
mx = z - x - 2;
}
return [mi, mx];
}
Use this to step through a reusable interview workflow for this problem.
Simulate the process step by step — multiply n times, check each number up to n, or iterate through all possibilities. Each step is O(1), but doing it n times gives O(n). No extra space needed since we just track running state.
Math problems often have a closed-form or O(log n) solution hidden behind an O(n) simulation. Modular arithmetic, fast exponentiation (repeated squaring), GCD (Euclidean algorithm), and number theory properties can dramatically reduce complexity.
Review these before coding to avoid predictable interview regressions.
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.