11

I have the following problem to test:

Rotate an array of n elements to the right by k steps.

For instance, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4]. How many different ways do you know to solve this problem?

My solution in intermediate array:

With Space is O(n) and time is O(n), I can create a new array and then copy elements to the new array. Then change the original array by using System.arraycopy().

public void rotate(int[] nums, int k) {
    if (k > nums.length) 
        k = k % nums.length;
 
    int[] result = new int[nums.length];
 
    for (int i = 0; i < k; i++) {
        result[i] = nums[nums.length - k + i];
    }
 
    int j = 0;
    for (int i = k; i < nums.length; i++) {
        result[i] = nums[j];
        j++;
    }
 
    System.arraycopy(result, 0, nums, 0, nums.length);
}

But is there a better way we can do it with bubble rotate (like bubble sort) in O(1) space?

chqrlie
  • 131,814
  • 10
  • 121
  • 189
Linux Le
  • 446
  • 1
  • 4
  • 8
  • 1
    Are you sure that "with n = 5 and k = 2, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4]" is correct? There seems to be more than 5 elements in that array? – almightyGOSU Jul 02 '15 at 02:53
  • http://stackoverflow.com/questions/26610309/java-rotating-array – izilotti Jul 02 '15 at 02:53
  • I've no idea how `n = 5` and `k = 2` gives the output you show in the question. – mazhar islam Jul 02 '15 at 02:54
  • 1
    Shouldn't that be "n = 7 and k = 3"? – Ted Hopp Jul 02 '15 at 02:56
  • Sorry my bad it was my error typing... it's n = 7 and k = 3. thanks! – Linux Le Jul 02 '15 at 02:59
  • You can use one temporary `int` variable instead of a whole `int` _array_. – mazhar islam Jul 02 '15 at 03:00
  • @rakeb.void - Yes, that is possible, and in at least two ways (that I know of). But at least one of those solutions is not so simple to implement correctly, and neither method is obvious. – Ted Hopp Jul 02 '15 at 03:03
  • No, it is not possible to solve it in constant time. – aleksandar Jul 02 '15 at 03:17
  • 2
    My favorite solution to this problem is the method described in Programming Pearls where you reverse the entire array, then reverse the sub-sections. More info here: http://articles.leetcode.com/2010/04/rotating-array-in-place.html – Daniel Nugent Jul 02 '15 at 03:18
  • @Ted- It's that one of the solution you told about --- for (int i = 0; i < order; i++) { for (int j = nums.length - 1; j > 0; j--) { int temp = nums[j]; nums[j] = nums[j - 1]; nums[j - 1] = temp; } – Linux Le Jul 02 '15 at 03:21
  • @LinuxLe - No, that was not one of the methods I had in mind. That method works (except it seems to me that it rotates to the left, and doesn't work for negative values of `k`). However, while it's O(1) in space, it's O(n*k) in time. The methods I had in mind are both O(n) in time. The method that Daniel Nugent references is one of the methods I was thinking of. Both that method and the other one I had in mind are described in the documentation for `Collections.rotate()`. – Ted Hopp Jul 02 '15 at 04:29

25 Answers25

8

Method 1 - The Reversal Algorithm(Good One):

Algorithm:

rotate(arr[], d, n)

reverse(arr[], l, n);

reverse(arr[], 1, n-d) ;

reverse(arr[], n - d + 1, n);

Let AB are the two parts of the input array where A = arr[0..n-d-1] and B = arr[n-d..n-1]. The idea of the algorithm is:

Reverse all to get (AB) r = BrAr.

Reverse A to get BrA. /* Ar is reverse of A */

Reverse B to get BA. /* Br is reverse of B */

For arr[] = [1, 2, 3, 4, 5, 6, 7], d =2 and n = 7

A = [1, 2, 3, 4, 5] and B = [ 6, 7]

Reverse all, we get BrAr = [7, 6, 5, 4, 3, 2, 1]

Reverse A, we get ArB = [7, 6, 1, 2, 3, 4, 5] Reverse B, we get ArBr = [6, 7, 5, 4, 3, 1, 2]

Here is the Code Snippet:

void righttRotate(int arr[], int d, int n)
{
  reverseArray(arr, 0, n-1);
  reverseArray(arr, 0, n-d-1);
  reverseArray(arr, n-d, n-1);
}

void reverseArray(int arr[], int start, int end)
{
  int i;
  int temp;
  while(start < end)
  {
    temp = arr[start];
    arr[start] = arr[end];
    arr[end] = temp;
    start++;
    end--;
   }
}

Method 2 - A Juggling Algorithm

Divide the array in different sets where number of sets is equal to GCD of n and d and move the elements within sets.

If GCD is 1, then elements will be moved within one set only, we just start with temp = arr[0] and keep moving arr[I+d] to arr[I] and finally store temp at the right place.

Here is an example for n =12 and d = 3. GCD is 3 and

Let arr[] be {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

  1. Elements are first moved in first set arr[] after this step --> {4 2 3 7 5 6 10 8 9 1 11 12}

  2. Then in second set. arr[] after this step --> {4 5 3 7 8 6 10 11 9 1 2 12}

  3. Finally in third set. arr[] after this step --> {4 5 6 7 8 9 10 11 12 1 2 3}

Here is the code:

void leftRotate(int arr[], int d, int n)
{
  int i, j, k, temp;
  int gcd = gcd(d, n);
  for (i = 0; i < gcd; i++)
  {
    /* move i-th values of blocks */
    temp = arr[i];
    j = i;
    while(1)
    {
      k = j + d;
      if (k >= n)
        k = k - n;
      if (k == i)
        break;
      arr[j] = arr[k];
      j = k;
    }
    arr[j] = temp;
  }
}

int gcd(int a,int b)
{
   if(b==0)
     return a;
   else
     return gcd(b, a%b);
}

Time complexity: O(n)

Auxiliary Space: O(1)

Method 3 - Rotate one by one:

righttRotate(arr[], d, n)

start

For i = 0 to i < d

Right rotate all elements of arr[] by one

end

To rotate by one, store arr[n-1] in a temporary variable temp, move arr[1] to arr[2], arr[2] to arr[3] …and finally temp to arr[0]

Let us take the same example arr[] = [1, 2, 3, 4, 5, 6, 7], d = 2, rotate arr[] by one 2 times. We get [7, 1, 2, 3, 4, 5, 6] after first rotation and [ 6, 7, 1, 2, 3, 4, 5] after second rotation.

Her is Code Snippet:

void leftRotate(int arr[], int d, int n)
{
  int i;
  for (i = 0; i < d; i++)
    leftRotatebyOne(arr, n);
}

void leftRotatebyOne(int arr[], int n)
{
  int i, temp;
  temp = arr[n-n];
  for (i = 0; i < n-1; i++)
     arr[i] = arr[i+1];
  arr[n - 1] = temp;
}

Time complexity: O(n*d)

Auxiliary Space: O(1)

Krzysztof Cichocki
  • 6,294
  • 1
  • 16
  • 32
TryinHard
  • 4,078
  • 3
  • 28
  • 54
3

The following code will do your job. This is for right rotate.

public void rightrotate(int[] nums, int k) {
    k %= nums.length;
    reverse(nums, 0, nums.length - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, nums.length - 1);
}

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

If you want to do left rotate just use the following

 public void leftrotate(int[] nums, int k) {
    k %= nums.length;
    reverse(nums, 0, k - 1);
    reverse(nums, k, nums.length - 1);
    reverse(nums, 0, nums.length - 1);
}
Md Johirul Islam
  • 5,042
  • 4
  • 23
  • 56
3

When k is negative, it rotates to the left. Space is O(1) and time is O(n)

static void rotate(int[] num, int k) {
    int n = num.length;
    k = k % n;
    if (k < 0) k += n;
    int[] result = new int[n];
    System.arraycopy(num, 0, result, k, n - k);
    System.arraycopy(num, n - k, result, 0, k);
    System.arraycopy(result, 0, num, 0, n);
}
2

ArrayUtil class is used to provide following utilities in primitive array

  1. swap array elements
  2. reverse array between startIndex and endIndex
  3. leftRotate array by shift

Algorithm for array rotation by shift-

  1. If we have to reverse array by shift value then take mod(%) with array length so that shift will become smaller than array length.
  2. Reverse array between index 0 and shift-1
  3. Reverse array between index shift and length-1.
  4. Reverse complete array between index 0 and length-1.

Space Complexity: In-place Algorithm, No extra space needed so O(1).

Time Complexity : Array reversal of size k take O(k/2) i.e swapping k/2 pairs of elements.

Array Reversal time- O(k) for k size array.

Total time in Rotation-

  • O(1) ..........for step 1
  • O(shift) ......for step 2
  • O(n - shift) ...for step 3
  • O(n) ...........for step 4

Total Time for array Rotation: O(1) + O(shift) + O(n-shift) + O(n) = O(n)

public class Solution {

    public static void main(String[] args) {
        int k = 3;
        int a[] = {1,2,3,4,5,6,7};

        ArrayUtil.leftRotate(a, k);

        for (int i : a)
            System.out.println(i);
    }
}

class ArrayUtil {

    public static final boolean checkIndexOutOfRange(int[] array, int index) {
        if (index < 0 || index > array.length)
            return true;
        return false;
    }

    public static final void swap(int[] array, int i, int j) {
        if (checkIndexOutOfRange(array, i) || checkIndexOutOfRange(array, j))
            return;
        int t = array[i];
        array[i] = array[j];
        array[j] = t;
    }

    public static final void reverse(int[] array, int startIndex, int endIndex) {
        if (checkIndexOutOfRange(array, startIndex) || checkIndexOutOfRange(array, endIndex))
            return;
        while (startIndex < endIndex) {
            swap(array, startIndex, endIndex);
            startIndex++;
            endIndex--;
        }
    }

    public static final void reverse(int[] array) {
        reverse(array, 0, array.length - 1);
    }

    public static final void leftRotate(int[] array, int shift) {
        int arrayLength = array.length;
        if (shift >= arrayLength)
            shift %= arrayLength;
        reverse(array, 0, shift - 1);
        reverse(array, shift, arrayLength - 1);
        reverse(array);
    }
}
Harshit
  • 207
  • 1
  • 5
1

Partial Code for ONE time array rotation

       last=number_holder[n-1];
       first=number_holder[0];
        //rotation 

        number_holder[0]=last;

        for(i=1;i<n;i++)
        {
            last=number_holder[i];
            number_holder[i]=first;
            first=last;
        }

Display the array

        for(i=1;i<n;i++)
        {
          System.out.println(number_holder[i]);
        }
nurawat
  • 27
  • 3
1

AFAIK, there are three ways to rotate an array with O(1) extra space, or put it another way, to swap two contiguous subarray.

  • reverse approach. reverse both part, then reverse all. most easy to code.
  • successively swap two contiguous block, until all items are in place.
  • juggling rotate, shell sort like. -- worse cache performance.

C++ has builtin function std::rotate(), which takes three iterator first, middle, last, and return new_middle, which is where the old first element lies in the rotated sequence.

I have checked the implementation on my computer, which use second approach I listed above. (line 1246 in /usr/lib/gcc/i686-pc-cygwin/5.4.0/include/c++/bits/stl_algo.h).

Below is my implementation of rotate, with test program.

#include <iostream>
#include <vector>

// same logic with STL implementation, but simpler, since no return value needed.
template <typename Iterator>
void rotate_by_gcd_like_swap(Iterator first, Iterator mid, Iterator last) {
    if (first == mid) return;
    Iterator old = mid;
    for (; mid != last;) {
        std::iter_swap(first, mid);
        ++first, ++mid;
        if (first == old) old = mid; // left half exhausted
        else if (mid == last) mid = old;
    }
}

// same logic with STL implementation
template <typename Iterator>
Iterator rotate_by_gcd_like_swap_then_return_new_mid(Iterator first, Iterator mid, Iterator last) {
    if (first == mid) return last;
    if (mid == last) return first;
    Iterator old = mid;
    for(;;) {
        std::iter_swap(first, mid);
        ++first, ++mid;
        if (first == old) old = mid;
        if (mid == last) break;
    }
    Iterator result = first; // when first time `mid == last`, the position of `first` is the new `mid`.
    for (mid = old; mid != last;) {
        std::iter_swap(first, mid);
        ++first, ++mid;
        if (first == old) old = mid;
        else if (mid == last) mid = old;
    }
    return result;
}

int main() {
    using std::cout;
    std::vector<int> v {0,1,2,3,4,5,6,7,8,9};
    cout << "before rotate: ";
    for (auto x: v) cout << x << ' '; cout << '\n';
    int k = 7;
    rotate_by_gcd_like_swap(v.begin(), v.begin() + k, v.end());
    cout << " after rotate: ";
    for (auto x: v) cout << x << ' '; cout << '\n';
    cout << "sz = " << v.size() << ", k = " << k << '\n';
}
qeatzy
  • 1,363
  • 14
  • 21
1

Above solutions talk about shifting array elements either by reversing them or any other alternative.

I've unique solution. How about determining the starting position of element after n rotations. Once we know that, then simply insert elements from that index and increment counter using modulus operation. Using this method we can avoid using extra array operations and so on.

Here is my code:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

void rotateLeft(int n,int r) {
    vector<long int> vec(n);
    int j = n;
    // get the position of starting index after r left rotations.
    while(r!=0) {
        --j;
        if(j==0)
            j = n;
        --r;
    }
    for(long int i=0;i<n;++i) {
        // simply read the input from there and increment j using modulus operator.
        cin>>vec[j];
        j = (j+1)%n;
    }
    // print the array
    for(long int i=0;i<n;++i) 
        cout<<vec[i]<<" ";
}
int rotateRight (int n,int r) {
    // get the position of starting index after r left rotations.
    int j = r % n;

    vector<long int> vec(n);
    for(int i=0;i<n;i++) {
        cin>>vec[j];
        j=(j+1)%n;
    }
    for(int i=0;i<n;i++)
        cout<<vec[i]<<" ";

}
int main() {

    long int n,r;   // n stands from number of elements in array and r stands for rotations.
    cin>>n>>r;
    // Time Complexity: O(n+r) Space Complexity: O(1)
    rotateLeft(n,r);
    // Time Complexity: O(n) Space Complexity: O(1)
    rotateRight(n,r);
    return 0;

}
Rohit Mourya
  • 285
  • 5
  • 17
1

Python code:

def reverse(arr,start , end):   
    while(start <= end):
        arr[start] , arr[end] = arr[end] , arr[start]
        start = start+1
        end = end-1

arr = [1,2,3,4,5,6,7]
n = 7
k = 2
reverse(arr,0,n-1)
# [7,6,5,4,3,2,1]
reverse(arr,0,n-1-k)
# [3,4,5,6,7,2,1]
reverse(arr,n-k,n-1)
# [3,4,5,6,7,1,2]

print arr
# [3, 4, 5, 6, 7, 8, 9, 1, 2]
Girish Gupta
  • 1,241
  • 13
  • 27
1

In Ruby Its very simple, Please take a look, Its one line.

def array_rotate(arr)
    i, j = arr.length - 1, 0
    arr[j],arr[i], i, j = arr[i], arr[j], i - 1, j + 1 while(j<arr.length/2)
    puts "#{arr}"
end

Input: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

Output: [20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Arjun
  • 815
  • 1
  • 8
  • 18
1

1.using a temp array and O(n) time

public static void rotateAnArrayUsingTemp(int arr[], int d, int n) {
    int temp[] = new int[d];
    int tempIndex = 0;
    for (int i = 0; i < d; i++) {
        temp[i] = arr[i];
    }
    for (int i = 0; i < arr.length - d; i++) {
        arr[i] = arr[i + d];
    }
    for (int i = arr.length - d; i < arr.length; i++) {
        arr[i] = temp[tempIndex++];
    }
}
0

This is a simple solution to rotate an array.

public class ArrayRotate {
    public int[] rotateArray(int array[], int k) {

        int newArray[] = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            newArray[(i + k) % array.length] = array[i];
        }
        System.arraycopy(newArray, 0, array, 0, array.length);
        return newArray;

    }

    public static void main(String[] args) {
        int array[] = { 1, 2, 3, 4, 5, 6, 7 };
        ArrayRotate rotate = new ArrayRotate();
        rotate.display(rotate.rotateArray(array, 3));

    }

    public void display(int array[]) {
        for (int i : array) {
            System.out.print(i + ",");
        }
    }
}

Runtime complexity is O(n)

There are several other algorithm to achieve the same.

  • using temp array
  • Rotate One By one
  • Juggling algorithm
  • reversal method
Prateek Kapoor
  • 947
  • 9
  • 18
0

This solution is O(1) space and O(N) time. It is in C#, takes an array parameter and rotates it in place. The algorithm goes through the first s (the shift) elements, starting with the first element moves it to the s_th position, then moves the s_th to the 2s_th position etc. If each of the first s elements rotates back to itself then there will be (arrayLength / s) * s = arrayLength loops, and at the end the array will be rotated by s. If the first s elements do not rotate back themselves, then there will still be cycles, say if s = 4, there could be one cycle which is 1-3-1 and the second 2-4-2, the line - if (ind == indAtBeg), checks for a cycle and terminates the while loop. The variable loopCount increments, when there is a rotation starting at any of the first s elements.

    public static void rotateArrayByS(int[] ar, int s)
    {
        int len = ar.Length, ind = 0, temp1 = ar[0], 
            temp2 /*temp1 and temp2 for switching elements*/, 
            loopCount /*rotations starting at the first s elemtns of ar*/ = 0;

        s %= len;

        while (loopCount < s)
        {
            int indAtBeg = ind;
            temp1 = ar[ind];

            bool done = false;
            while (!done)
            {
                if (ind < s)
                    loopCount++;

                ind = (ind + s) % len;

                //cycle detected
                if (ind == indAtBeg)
                    done = true;

                //switch the elements
                temp2 = ar[ind];
                ar[ind] = temp1;
                temp1 = temp2;
            }

            ++ind;
        }
    }
Lee.O.
  • 63
  • 5
0
#include <stdio.h>

int
main(void)
{
    int arr[7] = {1,2,3,4,5,6,7};
    int new_arr[7] = {0};
    int k = 3;
    int len = 7;
    int i=0;

    for (i = (len-1); i>=0; i--) {
        if ((i+k) >= len) {
            new_arr[(i+k-len)] = arr[i];
        } else {
            new_arr[(i+k)] = arr[i];
        }
    }

    for (i=0;i<len;i++) {
        printf("%d ", new_arr[i]);
    }

    return 0;
}

Time complexity O(n) Space complexity O(2*n).

Thanks.

NeilB
  • 347
  • 2
  • 16
0

Here is the complete Java code for left and right array rotation by k steps

import java.util.*;

public class ArrayRotation {
    private static Scanner sc;

    public static void main(String[] args) {
        int n,k;
        sc = new Scanner(System.in);
        System.out.print("Enter the size of array: ");
        n = sc.nextInt();

        int[] a = new int[n];
        System.out.print("Enter the "+n+" elements in the list: ");
        for(int i=0;i<n;i++)
            a[i] = sc.nextInt();

        System.out.print("Enter the number of left shifts to array: ");
        k = sc.nextInt();

        System.out.print("Array before "+k+" shifts: ");
        display(a);

        leftRoation(a,k);
        System.out.println();

        System.out.print("Array after "+k+" left shifts: ");
        display(a);

        rightRoation(a,k);
        System.out.println();

        System.out.print("Array after "+k+" right shifts: ");
        display(a);
    }

    public static void leftRoation(int[] a, int k){
        int temp=0, j;
        for(int i=0;i<k;i++){
            temp = a[0];
//          j=0;                    // both codes work i.e. for loop and while loop as well
//          while(j<a.length-1){
//              a[j]=a[j+1];
//              j++;
//          }   
            for(j=0;j<a.length-1;j++)
                a[j]=a[j+1];
            a[j]=temp;
        }           
    }

    public static void rightRoation(int[] a, int k){
        int temp=0, j;
        for(int i=0;i<k;i++){
            temp = a[a.length-1];
            for(j=a.length-1;j>0;j--)
                a[j]=a[j-1];
            a[j]=temp;
        }           
    }

    public static void display(int[] a){
        for(int i=0;i<a.length;i++)
            System.out.print(a[i]+" ");
    }
}

/****************** Output ********************
    Enter the size of array: 5
    Enter the 5 elements in the list: 1 2 3 4 5
    Enter the number of left and right shifts to array: 2
    Array before 2 shifts: 1 2 3 4 5 
    Array after 2 left shifts: 3 4 5 1 2 
    Array after 2 right shifts: 1 2 3 4 5  // here the left shifted array is taken as input and hence after right shift it looks same as original array.
 **********************************************/
Nik's
  • 21
  • 4
0

My solution... (a: the array, n : size of array, k: number of shifts) :

 public static int[] arrayLeftRotation(int[] a, int n, int k) {

    if (k == 0) return a;

    for (int i = 0; i < k; i++) {
        int retenue = a[0];
        int[] copie = java.util.Arrays.copyOfRange(a, 1, n );
        for (int y = 0; y <= copie.length - 1 ; y++) {
            a[y] = copie[y];
        }
        a[n-1] = retenue;
    }
    return a;
}
0

Java implementation for right rotation

            public int[] solution(int[] A, int K) {
                int len = A.length;
                //Create an empty array with same length as A
                int arr[] = new int[len];

                for (int i = 0; i < len; i++) {
                    int nextIndex = i + K;
                    if (nextIndex >= len) {
                        // wraps the nextIndex by same number of K steps
                        nextIndex = nextIndex % len;
                    }
                    arr[nextIndex] = A[i];
                }
                return arr;
            }
ashr
  • 299
  • 6
  • 13
0
>>> k = 3
>>> arr = [1,2,3,4,5,6,7]
>>> actual_rot = k % len(arr)
>>> left_ar = arr[:-actual_rot]
>>> right_ar = arr[-actual_rot:]
>>> result = right_ar + left_ar
>>> result
[5, 6, 7, 1, 2, 3, 4]
taras
  • 6,566
  • 10
  • 39
  • 50
0

A better way to rotate an array by k steps is:

a = [1,2,3,4,5,6]
b = a[:]
k = 2
for i in range(len(a)):
    a[(i + k) % len(a)] = b[i]## (rotate right by k steps)
    #a[(i - k) % len(a)] = b[i]## (rotate left by k steps)
print(a)

o/p: [6, 5, 1, 2, 3, 4]

0

how to rotate an array, IN this function first argument - array, the second argument is a number or integer.

def rotLeft(a, d):
    data = a
    n = d
    get = data[n:len(data)]
    remains = data[0:n]
    data.clear()
    for i in get:
        data.append(i)
    for x in remains:
        data.append(x)
    return data
0

This is rotating the array to the right by k steps, where k is non-negative

    for (int i = 0; i < k; i++) { 
      for (int j = nums.length - 1; j > 0; j--) {
         int temp = nums[j];
         nums[j] = nums[j - 1];
         nums[j - 1] = temp;
      }

   }
  return nums;
Pål Brattberg
  • 4,568
  • 29
  • 40
Ayesha
  • 7
  • 4
  • This is rotating the array to the right by k steps which is clearly mentioned above in the problem statement, where k is non-negative. Hope now its clear. Thanks – Ayesha Sep 22 '20 at 15:31
  • This is better and it does rotate to the right, but with many more writes than the OP's proposed solution in the general case. – chqrlie Sep 22 '20 at 20:06
0
    if (k > arr.length) {
        k = k % arr.length;
    }
    int n = arr.length - k;
    int count = 0;
  outer:
    for (int i = arr.length - 1; i >= n; i--) {
         int temp = arr[i];
       inner:
         for (int j = i - 1; j >= 0; j--) {
             arr[j + 1] = arr[j];
             if (j == 0) {
                 int temp2 = arr[j];
                 arr[j] = temp;
                 i = arr.length;
                 count++;
                 if (count == k) {
                     break outer;
                 }
             }
         }
     }
    
chqrlie
  • 131,814
  • 10
  • 121
  • 189
Ayesha
  • 7
  • 4
  • The first test should be `if (k >= arr.length)`, the line `int temp2 = arr[j];` is useless, there is no need to tag the inner loop. If you change the inner loop condition to `j > 0`, you can remove the `if (j == 0)` and move the `if`'s body out of the inner loop, removing the need to the `outer` tag. Actually, there does not seem to be a need for the `count` variable and test. – chqrlie Sep 22 '20 at 20:23
0

Here I have solved the same problem in go. Try to run in go playground...

sample code.

func rotate(a []int, k int)  {
    for j := 0; j < k ; j++ {
        temp := a[len(a)-1]
        for i := len(a) - 1; i > 0; i-- {
            a[i] = a[i-1]
        }
        a[0] = temp
    }
}
deepika azad
  • 131
  • 1
  • 1
  • 6
0

If you are looking for the soltuion of Codility - Cyclic Rotation Problem then, here is the JavaScript code which gave 100% for me.

function solution(A, K) {
  const L =  A.length - (K % A.length);    // to get the rotation length value below array length (since rotation of product of array length gives same array)
  const A1 = A.slice(L);                   // last part of array which need to be get to front after L times rotation
  const A2 = A.slice(0, L);                // part which rotate L times to right side
  const Result = [...A1, ...A2];           // reverse and join both array by spreading
  return Result;
}
Thanhal P A
  • 4,097
  • 3
  • 18
  • 38
0

Rotate an array of n elements to the right by k steps.

For instance, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

In JS the solution will be 2 part, in two line:

function rotateArray(array,k){
  // remove the rotation part
  const splice = [...array].splice(0,k); //... for make a clone;
  // add reversed version of the what left 
  return array.concat(splice.reverse()) from original array. 
}
pery mimon
  • 7,713
  • 6
  • 52
  • 57
0

Step-1: Array rotation to the right by one

  1. Take the backup of the rightmost element in the array, the last element (int temp = ar[ar.length-1];). If you are rotating to the left choose the leftmost element, the first element.
  2. Start a for loop from the last index of the array and stop it right before the first index (for(int i=ar.length-1; i>0; i--)).
  3. Replace the element from the current index with the one just behind it. (ar[i] = ar[i-1];). The array [8, 5, 6, 2, 1, -1, -100, 425, 84] after the loop will be [8, 8, 5, 6, 2, 1, -1, -100, 425].
  4. Replace the first element with the backup (ar[0] = temp;), giving you the rotated array as [84, 8, 5, 6, 2, 1, -1, -100, 425].

Now continue this process till the k becomes 0

while(k-- > 0) {
    
    int temp = ar[ar.length-1];
    
    for(int i=ar.length-1; i>0; i--) {
        
        ar[i] = ar[i-1];
    }
    
    ar[0] = temp;
}
Arun Sudhakaran
  • 2,167
  • 4
  • 27
  • 52