#java #arrays #collections #rotation
#java #массивы #Коллекции #вращение
Вопрос:
Я пытаюсь найти более оптимизированное решение проблемы ХакеррАнка «Массивы: поворот влево», поэтому я преобразовал массив int-примитивов в массив целых чисел и использовал метод Collections.rotate . В первой строке пользователь вводит n = количество целых чисел, затем k = количество поворотов влево, а во второй строке пользователь вводит n целых чисел, разделенных пробелами.
Но когда он был протестирован со следующим вводом:
61 48
431 397 149 275 556 362 852 789 601 357 516 575 670 507 127 888 284 405 806 27 495 879 976 467 342 356 908 750 769 947 425 643 754 396 653 595 108 75 347 394 935 252 683 966 553 724 629 567 93 494 693 965 328 187 728 389 70 288 509 252 449
Результат оказался отличным от ожидаемого.
Мой код следующий:
public class HackerRankArraysLeftRotationOptimized {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // the number of integers
int k = in.nextInt(); // the number of left rotations you must perform
int a[] = new int[n];
for(int a_i=0; a_i < n; a_i ){
a[a_i] = in.nextInt();
}
Integer[] newArray = new Integer[a.length];
int i = 0;
for (int value: a) {
newArray[i ] = Integer.valueOf(value);
}
for (int j = 0; j < k; j ) {
Collections.rotate(Arrays.asList(newArray), k);
}
for (int m = 0; m < newArray.length; m ) {
System.out.print(newArray[m] " ");
}
}
}
Может кто-нибудь объяснить мне, что не так с методом Collections.rotate?
Комментарии:
1. Привет, Эран, я удалил вопрос, спасибо за его редактирование.
Ответ №1:
Collections.rotate() вращается вправо, это первая проблема. Вторая проблема заключается в том, что вы вращаетесь k
в цикле, поэтому вы подсчитываете k*k
время. Вам просто нужно сделать это (не в цикле):
Collections.rotate(Arrays.asList(newArray), -k);
Комментарии:
1. Большое вам спасибо, ваше решение устранило проблему!