2016-10-03 2 views
1

Я пытаюсь найти более оптимизированное решение проблемы HackerRank «Массивы: Левое вращение», поэтому я преобразовал массив примитивов int в массив целых чисел и использовал метод Collections.rotate. В первой строке пользователь вводит n = число целых чисел, тогда k = число левых поворотов , а во второй строке пользователь вводит n целых чисел, разделенных пробелами.Метод Collections.rotate не работает для больших массивов целых чисел

Но когда он был протестирован со следующим входом:

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?

+0

Привет, Эран, я неудаленный вопрос, спасибо за редактирование. –

ответ

1

Collections.rotate() вращается вправо, это первая проблема. Вторая проблема заключается в том, что вы вращаетесь на k в цикле, так что вы суммируете k*k раз. Вам просто нужно сделать это (не в цикле):

Collections.rotate(Arrays.asList(newArray), -k);

+0

Большое спасибо, ваше решение устранило проблему! –

Смежные вопросы