Saturday, January 26, 2019

Arrays: Left Rotation - Hacker Rank Solution

Arrays: Left Rotation - Hacker Rank Solution
Check out the resources on the page's right side to learn more about arrays. The video tutorial is by Gayle Laakmann McDowell, author of the best-selling interview book 
Cracking the Coding Interview.
left rotation operation on an array shifts each of the array's elements  unit to the left. For example, if  left rotations are performed on array , then the array would become .
Given an array  of  integers and a number, , perform  left rotations on the array. Return the updated array to be printed as a single line of space-separated integers.
Function Description
Complete the function rotLeft in the editor below. It should return the resulting array of integers.
rotLeft has the following parameter(s):
  • An array of integers .
  • An integer , the number of rotations.
Input Format
The first line contains two space-separated integers  and , the size of  and the number of left rotations you must perform.
The second line contains  space-separated integers .
Constraints
Output Format
Print a single line of  space-separated integers denoting the final state of the array after performing  left rotations.
Sample Input
5 4
1 2 3 4 5
Sample Output
5 1 2 3 4

Arrays: Left Rotation - Hacker Rank Solution

To solve this challenge, we perform the following basic steps:
  1. Create a new -element (where  is the length of ) array named  to hold the rotated items.
  2. Copy the contents of  over to the new array in two parts:
    • The -element contiguous segment from  to  must be copied over to the contiguous segment starting at .
    • The -element contiguous segment from  to  must be copied over to the contiguous segment starting at .
  3. Reassign the reference to  so that it points to  instead.
This is implemented by the following Java code:
public static int[] rotateArray(int[] arr, int d){
    // Because the constraints state d < n, we need not concern ourselves with shifting > n units.
    int n = arr.length;

    // Create new array for rotated elements:
    int[] rotated = new int[n]; 

    // Copy segments of shifted elements to rotated array:
    System.arraycopy(arr, d, rotated, 0, n - d);
    System.arraycopy(arr, 0, rotated, n - d, d);

    return rotated;
}
In Python, we can implement the function in one line with array slicing:
def solve(a, d):
 return(a[d:]+a[:d])
We can also create a more general function that does account for  cases by adding a modulo division.
Each time the rotation equals the length of the array, the array appears unchanged. Thus, the final rotation for d is same as the rotation for  and we use that for our slice index. Here it is, implemented in python:
# Complete the solve function below.
def solve(a, d):
 i = d%len(a)
 return(a[i:]+a[:i])
Problem Tester's code:

Java

import java.util.*;
import java.lang.System;

public class Solution {
    
    public static int[] rotateArray(int[] arr, int d){
        // Because the constraints state d < n, we need not concern ourselves with shifting > n units.
        int n = arr.length;
        
        // Create new array for rotated elements:
        int[] rotated = new int[n]; 
        
        // Copy segments of shifted elements to rotated array:
        System.arraycopy(arr, d, rotated, 0, n - d);
        System.arraycopy(arr, 0, rotated, n - d, d);

        return rotated;
    }
    
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int d = scanner.nextInt();
        int[] numbers = new int[n];
        
        // Fill initial array:
        for(int i = 0; i < n; i++){
            numbers[i] = scanner.nextInt();
        }
        scanner.close();
        
        // Rotate array by d elements:
        numbers = rotateArray(numbers, d);
        
        // Print array's elements as a single line of space-separated values:
        for(int i : numbers) {
            System.out.print(i + " ");
        }
        System.out.println();
    } 
        
}

1 comment:

  1. //using slice method
    def rotate(arr,d):
    return arr[d:]+arr[0:d]

    ReplyDelete

Powered by Blogger.