static void rotateByDelements(int[] a, int d) {
    // reverse the first part till d elements
    ReverseArray.reverseArray(a, 0, d - 1);
    // reverse the entire array
    ReverseArray.reverseArray(a, 0, a.length - 1);
    // reverse the second half after d elements to get the rotation

    ReverseArray.reverseArray(a, 0, a.length - 1 - d);
  }
  public static void main(String[] args) {

    Integer[] arr = {1, 2, 3, 4, 5};

    System.out.println("Array inserted {}");
    for (int i = 0; i < arr.length; i++) // Used For-loop
    {
      System.out.print(" " + arr[i]);
    }

    ReverseArray reverseArray = new ReverseArray();
    System.out.println();
    System.out.println("Reversed Array {}");

    Integer[] revArr = reverseArray.reverseArr(arr);
    for (int i = 0; i < revArr.length; i++) // Used For-loop
    {
      System.out.print(" " + revArr[i]);
    }
  }
  // before: 1,2,3,4,5,6, shift: 2
  // after:  5,6,1,2,3,4
  // Time - O(N), Space - O(1)
  public int[] rotate(final int[] array, int shift) {
    if (array == null || shift < 0) {
      return null;
    }

    final ReverseArray reverseArray = new ReverseArray();

    // adjust based on shift
    shift %= array.length;

    int shiftLength = array.length - shift;
    int actualLength = array.length - 1;

    // reverse non-shift elements
    reverseArray.reverse(array, 0, shiftLength - 1); // 4,3,2,1,|5,6

    // reverse shift elements
    reverseArray.reverse(array, shiftLength, actualLength); // 4,3,2,1,|6,5

    // reverse the entire array
    reverseArray.reverse(array, 0, actualLength); // 5,6|,1,2,3,4

    return array;
  }