Невозможно придумать способ сдвинуть массив - PullRequest
2 голосов
/ 23 октября 2019

Я застрял и не могу придумать, как правильно сместить массив на __ единиц. Я пытаюсь создать массив из 30 элементов (числа 1-30), которые затем можно сместить вправо на число, введенное пользователем. Это будет означать, что первые несколько чисел в массиве будут иметь индексы в конце массива, а остальные числа будут смещены влево. (Например, если shift = 3, числа 1,2,3 будут принимать индекс 27,28,29, а остальные числа 4-30 будут сдвигаться влево, составляя индекс 0 = 4, индекс 1 = 5, индекс 2= 6 ....

import java.util.*;

class Main {
  public static void main(String[] args) {
    Scanner input = new Scanner (System.in);

    System.out.println("\nEnter the shift/rotation:");
    int shiftNum = input.nextInt();

    int [] numArray = new int [30];

    for(int i = 0; i < 30; i++){
        numArray [i] = i+1;
        System.out.print(numArray[i]+" ");
    }

  }
}

Это код, который у меня есть, какие-либо предложения о том, как я могу это сделать? Я попытался создать отдельный цикл for, например

numArray [i-shiftNum] = numArray[i];

Но при этом индекс 0-shiftNum будет отрицательным и не будет работать. Вот контекст проблемы:

Создайте программу, которая создаст массив из 30 элементов. Затем он будет вращать массив на число, выбранное пользователем.

Ответы [ 4 ]

4 голосов
/ 23 октября 2019

Вот быстрое решение для вас. Пожалуйста, проверьте следующий код.

Ввод:

Введите смещение / вращение: 4

Выход:

Поворот заданного массива [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,23, 24, 25, 26, 27, 28, 29, 30]

после поворота [27, 28, 29, 30, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

    public static void main(String[] args) {
    RotationDemo rd = new RotationDemo();
    int[] input = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30};
    int k = 0;
    Scanner scan = new Scanner (System.in);
    try{
         System.out.println("\nEnter the shift/rotation:");
         int shiftNum = scan.nextInt();
         if(shiftNum < 30) {
             k = shiftNum;
             System.out.println("Rotate given array " + Arrays.toString(input));
             int[] rotatedArray = rd.rotateRight(input, input.length, k);
             System.out.println("After Rotate  " + 
                  Arrays.toString(rotatedArray));
         } else {
            System.out.println("Shift number should be less than 30");
         }
         } catch(Exception ex){
         } finally {
            scan.close();
        }
      }
      public int[] rotateRight(int[] input, int length, int numOfRotations) {
        for (int i = 0; i < numOfRotations; i++) {
          int temp = input[length - 1];
          for (int j = length - 1; j > 0; j--) {
            input[j] = input[j - 1];
          }
          input[0] = temp;
        }
        return input;
      }

Надеюсь, этот пример работает.

3 голосов
/ 23 октября 2019

Чтобы сместить числа в массиве, для смещения значений в массиве работает следующий цикл:

// prerequisite: array is already filled with values
for(int i = 0; i < numArray.length; i++) {
    arr[i] += shiftNum;

    if (numArray[i] > 30) { 
        numArray[i] -= 30;
    } else if (numArray[i] <= 0) {
        numArray[i] += 30;
    }
}

Согласно вашему коду, созданный массив будет содержать значения от 1 до 30включая 1 и 30. Если вы хотите, чтобы ваш код содержал значения от 0 до 29, измените numArray [i]> 30 на numArray [i]> = 30 и измените numArray [i] <= 0 на numArray [i] <0. </p>

0 голосов
/ 23 октября 2019

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

1) Создайте временный массив размером s (количество смен).

2)Скопируйте первые s элементы из исходного массива во временный массив.

3) Сдвиньте элементы в исходном массиве на s .

4) Заменить последние элементы s в исходном массиве элементами во временном массиве.

Вот код:

public static void main(String[] args) throws IOException {
        Scanner scan = new Scanner(System.in);
        int [] arr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
        int s = scan.nextInt(); // shift by
        int [] tempArr = new int[s];
        // copying last s elements to temp
        for(int i =0; i < s; i++)
            tempArr[i] = arr[i];

        // shifting the original array
        for(int i = s; i < arr.length; i++)
            arr[i-s] = arr[i];

        // putting temp elements at the back of the original array
        int d = s-1;
        for(int i = arr.length-1; i >= arr.length-s; i--)
            arr[i] = tempArr[d--];

        // printing array
        for (int value : arr) System.out.print(value + " ");
    }

Надеюсь, это поможет.

0 голосов
/ 23 октября 2019

Используйте удобные методы Java. Большинство людей все еще хотят писать для петель. По сути, вам нужно сохранить элементы, которые вы перезаписываете с помощью Shift. Затем поместите эти сохраненные обратно в массив. System.arraycopy хорош тем, что он заботится о некоторых неприятных частях движущихся элементов в массиве.

void shift(int shiftBy, int... array) {
    int[] holdInts = Arrays.copyOf(array, shiftBy);
    System.arraycopy(array, shiftBy, array, 0, array.length - shiftBy);
    System.arraycopy(holdInts, 0, array, array.length - shiftBy, holdInts.length);
}
...