leetcode

Leetcode Solutions (0x6A73)
git clone https://git.pngu.org/leetcode
Log | Files | Refs | Submodules | README

rotate_array.c (975B)


// 189. Rotate Array
#include "leetcode.h"

/*
 * given an integer array 'nums', rotate the array to the right by 'k' stops,
 * where 'k' is non-negative.
 */

void reverse(int *nums, int start, int end) {
  while (start < end) {
    nums[start] ^= nums[end];
    nums[end] ^= nums[start];
    nums[start++] ^= nums[end--];
  }
}

void rotate(int *nums, int numsSize, int k) {
  int start = 0, end = numsSize - 1;
  k %= numsSize;
  reverse(nums, start, end - k);
  reverse(nums, numsSize - k, end);
  reverse(nums, start, end);
}

int main() {
  int n1[] = {1, 2, 3, 4, 5, 6, 7}, r1[] = {5, 6, 7, 1, 2, 3, 4};
  int n2[] = {-1, -100, 3, 99}, r2[] = {3, 99, -1, -100};
  rotate(n1, ARRAY_SIZE(n1), 3);
  rotate(n2, ARRAY_SIZE(n2), 2);
  for (int i = 0; i < ARRAY_SIZE(n1); i++) {
    printf("%d ", n1[i]);
    assert(r1[i] == n1[i]);
  }
  printf("\n");
  for (int i = 0; i < ARRAY_SIZE(n2); i++) {
    printf("%d ", n2[i]);
    assert(r2[i] == n2[i]);
  }
  printf("\n");
}