Skip to content

Instantly share code, notes, and snippets.

@shailrshah
Last active November 17, 2017 16:17
Show Gist options
  • Save shailrshah/88da442e884a4c6470ad3739a180ff65 to your computer and use it in GitHub Desktop.
Save shailrshah/88da442e884a4c6470ad3739a180ff65 to your computer and use it in GitHub Desktop.
Rotate an array of n elements to the right or left by k steps.
// rotate([1, 2, 3, 4, 5], 2, 'r')
// [5, 4, | 3, 2, 1] reverse(nums, 0, n-1)
// [4, 5, | 3, 2, 1] reverse(nums, 0, k-1)
// [4, 5, | 1, 2, 3] reverse(nums, k, n-1)
// rotate([1, 2, 3, 4, 5], 2, 'l')
// [5, 4, 3, | 2, 1] reverse(nums, 0, n-1)
// [3, 4, 5, | 2, 1] reverse(nums, 0, n-k-1)
// [3, 4, 5, | 1, 2] reverse(nums, n-k, n-1)
public void rotate(int[] nums, int k, char dir) {
int n = nums.length;
if(n == 0) return;
k %= n;
reverse(nums, 0, n-1);
if(dir == 'r') {
reverse(nums, 0, k-1);
reverse(nums, k, n-1);
} else if(dir == 'l') {
reverse(nums, 0, n-k-1);
reverse(nums, n-k, n-1);
} else throw new IllegalArgumentException();
}
public void reverse(int[] a, int i, int j) {
while(i < j)
swap(a, i++, j--);
}
public void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment