Вращение целочисленного массива Java (слева)

У меня есть простая функция вращения, которая принимает массив и число, чтобы повернуть числа влево

например [1,2,3,4,5] & 2 - вывод: [3,4,5,1,2].

Я хочу знать наиболее эффективный способ выполнения этой функции, будь то преобразование массива int в строку, сращивание его или копирование массива или преобразование в List<Integer>.

Если кому-то нужна дополнительная информация, спрашивайте!

мое решение на данный момент:

static int[] rotLeft(int[] a, int d) {
    int lengthOfArray = a.length;
    int[] temp = new int[lengthOfArray];
    for(int i = 0; i < lengthOfArray; i++){
        int newLocation = (i + (lengthOfArray - d)) % lengthOfArray;
        temp[newLocation] = a[i];
    }
    return temp;
}

Можете ли вы показать свое текущее решение и почему вы думаете, что оно неэффективно?

OneCricketeer 08.10.2018 19:10

Для выполнения этой операции дополнительный collection не требуется. Вы можете сделать это, используя сами массивы.

Nicholas K 08.10.2018 19:12

@NicholasK может объяснить, пожалуйста?

aidan22 08.10.2018 19:15

Прочтите документацию Collections.rotate(List, int). Примените его к массиву.

Louis Wasserman 08.10.2018 19:19

@ aidan22: Почему бы вам сначала не сохранить весь ввод в массиве, а затем сдвинуть его влево?

Nicholas K 08.10.2018 19:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
877
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Почему бы тебе не попробовать это

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

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

и вызвать этот метод вызова, как показано ниже

int arr[] = { 1, 2, 3, 4, 5 }; 
Rotate(arr, 2, 5); 

это упражнение по решению проблем из книги, пытающееся решить только с двумя параметрами.

aidan22 08.10.2018 19:23

Я заявил, что это упражнение, в котором я могу использовать только эти параметры, я ищу более эффективные решения для своего ответа, и, как заявил @NicholasK, я не голосовал и не могу проголосовать за вас.

aidan22 08.10.2018 20:00
Ответ принят как подходящий

Простой способ сделать это со сложностью O(n), как показано ниже, вместе с обработкой действительного shifts int[] arr: - это массив int, n=length массива, d = сколько требуется сдвигов.

    public int[] leftRotate(int[] arr, int n, int d) {

    int rot = 0;
    int[] marr = new int[n];
    if (d < 0 || d == 0 || d>n) {
        return arr;
    }

    else {
        for (int i = 0; i < n; i++) {

            if (i < n - d) {
                marr[i] = arr[i + d];
            } else {
                marr[i] = arr[rot];
                rot++;
            }

        }

        return marr;
    }

}

    public void GetArray(int[] arr, int n, int d) {

    int[] arr1 = leftRotate(arr, n, d);
    for (int j : arr1) {
        System.out.println(j);
    }
}

    public static void main(String args[]) {

    int[] arr = { 1,2,3,4,5 };
    int n = arr.length;

    Test2 obj = new Test2();
    obj.GetArray(arr, n, 2);

}

Другие вопросы по теме