THN Interview Prep

189. Rotate Array

At a Glance

  • Topic: arrays-hashing
  • Pattern: Reverse trick (triple reverse)
  • Difficulty: Medium
  • Companies: Amazon, Microsoft, Apple, Google, Meta
  • Frequency: High
  • LeetCode: 189

Problem (one-liner)

Given integer array numbers and non-negative steps, rotate the array to the right by steps positions in-place. Equivalently, each element moves steps steps forward with wrap-around.

Recognition Cues

  • "Rotate array right by k"
  • k may exceed n — reduce with k % n; in-place O(1) extra → reverse method or cyclic swaps

Diagram

At-a-glance flow (replace with problem-specific Mermaid as you refine this note). camelCase node IDs; no spaces in IDs.

Loading diagram…

Approaches

  • Brute force — slice concat extra array — O(n) space.
  • Better — rotate one step steps times — O(n · steps) worst.
  • Optimal — reverse all, reverse first steps, reverse rest (after normalizing steps) — O(n) time / O(1) space.

Optimal Solution

Go

package main

func rotate(numbers []int, steps int) {
	length := len(numbers)
	if length == 0 {
		return
	}
	steps = steps % length
	reverseRange(numbers, 0, length-1)
	reverseRange(numbers, 0, steps-1)
	reverseRange(numbers, steps, length-1)
}

func reverseRange(numbers []int, left int, right int) {
	for left < right {
		numbers[left], numbers[right] = numbers[right], numbers[left]
		left++
		right--
	}
}

JavaScript

function rotate(numbers, steps) {
	const length = numbers.length;
	if (length === 0) {
		return;
	}
	const normalized = steps % length;
	reverseRange(numbers, 0, length - 1);
	reverseRange(numbers, 0, normalized - 1);
	reverseRange(numbers, normalized, length - 1);
}

function reverseRange(numbers, left, right) {
	let leftBound = left;
	let rightBound = right;
	while (leftBound < rightBound) {
		[numbers[leftBound], numbers[rightBound]] = [numbers[rightBound], numbers[leftBound]];
		leftBound++;
		rightBound--;
	}
}

Walkthrough

numbers = [1,2,3,4,5,6,7], steps = 3[5,6,7,1,2,3,4]

stepoperationarray (conceptual)
0start1 2 3 4 5 6 7
1reverse all7 6 5 4 3 2 1
2reverse first steps5 6 7
3reverse remainder5 6 7 1 2 3 4

Invariant: triple reverse equals rotating right by steps when steps normalized.

Edge Cases

  • steps % n == 0 — array unchanged.
  • n == 1 — no-op.
  • steps huge — modulo first.

Pitfalls

  • Off-by-one in reverse ranges after modulo.
  • Using extra O(n) array when O(1) required.

Similar Problems

Variants

  • Left rotation — adjust reverse segment bounds.
  • Rotate linked list — close cycle + break link.

Mind-Map Tags

#arrays #reverse #in-place #rotation #modular-index

Last updated on

Spotted something unclear or wrong on this page?

On this page