Encuentra el elemento en el índice dado después de un número de rotaciones

Se da una array que consta de N enteros. Hay varias rotaciones circulares derechas de rango [L..R] que realizamos. Después de realizar estas rotaciones, necesitamos encontrar un elemento en un índice dado.
Ejemplos: 
 

Input : arr[] : {1, 2, 3, 4, 5}
        ranges[] = { {0, 2}, {0, 3} }
        index : 1
Output : 3
Explanation : After first given rotation {0, 2}
                arr[] = {3, 1, 2, 4, 5}
              After second rotation {0, 3} 
                arr[] = {4, 3, 1, 2, 5}
After all rotations we have element 3 at given
index 1. 

Método: fuerza bruta El enfoque de fuerza bruta consiste en rotar la array para todos los rangos dados y, finalmente, devolver el elemento en el índice dado en la array modificada.
Método: Eficiente Podemos hacer el procesamiento fuera de línea después de guardar todos los rangos. 
Supongamos que nuestros rangos de rotación son: [0..2] y [0..3] 
Corremos a través de estos rangos desde el reverso.
Después del rango [0..3], el índice 0 tendrá el elemento que estaba en el índice 3. 
Entonces, podemos cambiar 0 a 3, es decir, si el índice = izquierda, el índice se cambiará a la derecha. 
Después del rango [0..2], el índice 3 no se verá afectado.
Entonces, podemos hacer 3 casos: 
si índice = izquierda, el índice se cambiará a la derecha. 
Si el índice no está acotado por el rango, no hay efecto de rotación. 
Si el índice está dentro de los límites, el índice tendrá el elemento en índice-1.
A continuación se muestra la implementación: 
 

Para una mejor explicación: –

10 20 30 40 50

Índice: 1

Rotaciones: {0,2} {1,4} {0,3}

Respuesta: el índice 1 tendrá 30 después de las 3 rotaciones en el orden {0,2} {1,4} {0,3}.

Realizamos {0,2} en A y ahora tenemos una nueva array A1.

Realizamos {1,4} en A1 y ahora tenemos una nueva array A2.

Realizamos {0,3} en A2 y ahora tenemos una nueva array A3.

Ahora estamos buscando el valor en el índice 1 en A3.

Pero A3 se hace {0,3} en A2.

Entonces, el índice 1 en A3 es el índice 0 en A2.

Pero A2 se hace {1,4} en A1.

Entonces, el índice 0 en A2 también es el índice 0 en A1, ya que no se encuentra en el rango {1,4}.

Pero A1 se hace {0,2} en A.

Entonces, el índice 0 en A1 es el índice 2 en A.

Al observarlo, vamos profundizando en las rotaciones anteriores a partir de la última rotación.

{0,3}

|

{1,4}

|

{0,2}

Esta es la razón por la que estamos procesando las rotaciones en orden inverso.

Tenga en cuenta que no estamos rotando los elementos en el orden inverso, solo procesando el índice desde el reverso.

Porque si realmente rotamos en orden inverso, podríamos obtener una respuesta completamente diferente, ya que en el caso de las rotaciones, el orden importa. 

C++

// CPP code to rotate an array
// and answer the index query
#include <bits/stdc++.h>
using namespace std;
 
// Function to compute the element at
// given index
int findElement(int arr[], int ranges[][2],
            int rotations, int index)
{
    for (int i = rotations - 1; i >= 0; i--) {
 
        // Range[left...right]
        int left = ranges[i][0];
        int right = ranges[i][1];
 
        // Rotation will not have any effect
        if (left <= index && right >= index) {
            if (index == left)
                index = right;
            else
                index--;
        }
    }
 
    // Returning new element
    return arr[index];
}
 
// Driver
int main()
{
    int arr[] = { 1, 2, 3, 4, 5 };
 
    // No. of rotations
    int rotations = 2;
 
    // Ranges according to 0-based indexing
    int ranges[rotations][2] = { { 0, 2 }, { 0, 3 } };
 
    int index = 1;
 
    cout << findElement(arr, ranges, rotations, index);
 
    return 0;
 
}

C

// C code to rotate an array
// and answer the index query
#include <stdio.h>
 
// Function to compute the element at
// given index
int findElement(int arr[], int ranges[][2], int rotations,
                int index)
{
    for (int i = rotations - 1; i >= 0; i--) {
 
        // Range[left...right]
        int left = ranges[i][0];
        int right = ranges[i][1];
 
        // Rotation will not have any effect
        if (left <= index && right >= index) {
            if (index == left)
                index = right;
            else
                index--;
        }
    }
 
    // Returning new element
    return arr[index];
}
 
// Driver
int main()
{
    int arr[] = { 1, 2, 3, 4, 5 };
 
    // No. of rotations
    int rotations = 2;
 
    // Ranges according to 0-based indexing
    int ranges[2][2] = { { 0, 2 }, { 0, 3 } };
 
    int index = 1;
 
    printf("%d",
           findElement(arr, ranges, rotations, index));
 
    return 0;
}
 
// This code is contributed by Deepthi

Java

// Java code to rotate an array
// and answer the index query
import java.util.*;
 
class GFG
{
    // Function to compute the element at
    // given index
    static int findElement(int[] arr, int[][] ranges,
                            int rotations, int index)
    {
        for (int i = rotations - 1; i >= 0; i--) {
 
            // Range[left...right]
            int left = ranges[i][0];
            int right = ranges[i][1];
 
            // Rotation will not have any effect
            if (left <= index && right >= index) {
                if (index == left)
                    index = right;
                else
                    index--;
            }
        }
 
        // Returning new element
        return arr[index];
    }
 
    // Driver
    public static void main (String[] args) {
        int[] arr = { 1, 2, 3, 4, 5 };
 
        // No. of rotations
        int rotations = 2;
     
        // Ranges according to 0-based indexing
        int[][] ranges = { { 0, 2 }, { 0, 3 } };
 
        int index = 1;
        System.out.println(findElement(arr, ranges,
                                rotations, index));
    }
}
 
/* This code is contributed by Mr. Somesh Awasthi */

Python3

# Python 3 code to rotate an array
# and answer the index query
 
# Function to compute the element
# at given index
def findElement(arr, ranges, rotations, index) :
     
    for i in range(rotations - 1, -1, -1 ) :
     
        # Range[left...right]
        left = ranges[i][0]
        right = ranges[i][1]
 
        # Rotation will not have
        # any effect
        if (left <= index and right >= index) :
            if (index == left) :
                index = right
            else :
                index = index - 1
         
    # Returning new element
    return arr[index]
 
# Driver Code
arr = [ 1, 2, 3, 4, 5 ]
 
# No. of rotations
rotations = 2
 
# Ranges according to
# 0-based indexing
ranges = [ [ 0, 2 ], [ 0, 3 ] ]
 
index = 1
 
print(findElement(arr, ranges, rotations, index))
     
# This code is contributed by Nikita Tiwari.

C#

// C# code to rotate an array
// and answer the index query
using System;
 
class GFG
{
    // Function to compute the
    // element at given index
    static int findElement(int []arr, int [,]ranges,
                        int rotations, int index)
    {
        for (int i = rotations - 1; i >= 0; i--)
        {
 
            // Range[left...right]
            int left = ranges[i, 0];
            int right = ranges[i, 1];
 
            // Rotation will not
            // have any effect
            if (left <= index &&
                right >= index)
            {
                if (index == left)
                    index = right;
                else
                    index--;
            }
        }
 
        // Returning new element
        return arr[index];
    }
 
    // Driver Code
    public static void Main ()
    {
        int []arr = { 1, 2, 3, 4, 5 };
 
        // No. of rotations
        int rotations = 2;
     
        // Ranges according
        // to 0-based indexing
        int [,]ranges = { { 0, 2 },
                        { 0, 3 } };
 
        int index = 1;
        Console.Write(findElement(arr, ranges,
                                    rotations,
                                    index));
    }
}
 
// This code is contributed
// by nitin mittal.

PHP

<?php
// PHP code to rotate an array
// and answer the index query
 
// Function to compute the
// element at given index
function findElement($arr, $ranges,
                    $rotations, $index)
{
    for ($i = $rotations - 1;
        $i >= 0; $i--)
    {
 
        // Range[left...right]
        $left = $ranges[$i][0];
        $right = $ranges[$i][1];
 
        // Rotation will not
        // have any effect
        if ($left <= $index &&
            $right >= $index)
        {
            if ($index == $left)
                $index = $right;
            else
                $index--;
        }
    }
 
    // Returning new element
    return $arr[$index];
}
 
// Driver Code
$arr = array(1, 2, 3, 4, 5);
 
// No. of rotations
$rotations = 2;
 
// Ranges according
// to 0-based indexing
$ranges = array(array(0, 2),
                array(0, 3));
 
$index = 1;
 
echo findElement($arr, $ranges,
                $rotations, $index);
 
// This code is contributed by ajit
?>

Javascript

<script>
 
// JavaScript code to rotate an array
// and answer the index query
 
// Function to compute the element at
// given index
let findElement = (arr, ranges,rotations,index)=>{
    for (let i = rotations - 1; i >= 0; i--) {
        // Range[left...right]
        let left = ranges[i][0];
        let right = ranges[i][1];
 
        // Rotation will not have any effect
        if (left <= index && right >= index) {
            if (index == left)
                index = right;
            else
                index--;
        }
    }
 
    // Returning new element
    return arr[index];
}
 
// Driver Code
let arr = [ 1, 2, 3, 4, 5 ];
 
// No. of rotations
let rotations = 2;
 
// Ranges according to 0-based indexing
let ranges = [ [ 0, 2 ], [ 0, 3] ];
 
let index = 1;
 
document.write(findElement(arr, ranges, rotations, index));
 
</script>

Producción : 

3

Complejidad del tiempo: O(R), R es el número de rotaciones

Espacio Auxiliar: O(1),

Este artículo es una contribución de Rohit Thapliyal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *