Puzzle DD40


Rotate every array element N positions left

[M-10] Write a function that rotates an integer array left by N positions. If N is negative, rotate N positions right. If N is greater than the size of the array, change N to N%size.

   0    1    2    3    4    5    6    7    8    9
  10   11   12   13   14   15   16   17   18   19
  20   21   22   23   24   25   26   27   28   29

Rotated Left by 10:
  10   11   12   13   14   15   16   17   18   19
  20   21   22   23   24   25   26   27   28   29
   0    1    2    3    4    5    6    7    8    9

You can do this puzzle with some small changes to the solutions to D39, or see if you can create a completely different way to rotate [H-15].

Here is a testing framework:

#include <stdio.h>
#include <stdlib.h>

void rotateLeftArray( int size, int arr[] );

/* Puzzle D40 -- rotate every array element N positions left */

void rotateLeftNArray( int size, int arr[], int N )
{
}

void rotateLeftArray( int size, int arr[] )
{
  int j;
  int temp;
  
  temp = arr[0];
  for ( j=0; j<size-1; j++ )
      arr[j] = arr[j+1];
      
  arr[size-1] = temp;
}

void fillArrayInOrder( int size, int arr[] )
{
  int j;
  
  for ( j=0; j<size; j++ )
  {
    arr[j] = j;
  }
}

void printArray( int size, int arr[] )
{
  const int N = 10;
  int j;
  
  for ( j=0; j<size; j++ )
  {
    if ( j%N == N-1 )
      printf("%4d\n", arr[j] );
    else
      printf("%4d ", arr[j] );    
  }
}

int main()
{
  const int SIZE = 30;
  int x[ SIZE ];
  int shift = 10;
  
  fillArrayInOrder( SIZE, x );
  printArray( SIZE, x );
  printf("\nRotated Left by %d (version 1): \n", shift);
  rotateLeftNArray( SIZE, x, shift );
  printArray( SIZE, x );

  fillArrayInOrder( SIZE, x );
  printf("\nRotated Left by %d (version 2): \n", shift);
  rotateLeftNArrayV2( SIZE, x, shift );
  printArray( SIZE, x );

  printf("\n\n");
  return 0;
}


Answer         Next Page         Previous Page Home