Задача
Циклический сдвиг. Осуществить циклический сдвиг элементов массива [latex]T(n)[/latex] на [latex]m[/latex] позиций влево, то есть получить массив: [latex]t_{m+1},…,t_{n},t_{1},…,t_{m}[/latex].
При этом необязательно [latex]m<n[/latex].
Тесты:
изначальный массив | сдвиг (m) | результат | комментарий |
1 2 3 4 5 6 7 | 2 | 3 4 5 6 7 1 2 | пройден |
1 2 3 4 5 6 7 | 0 | 1 2 3 4 5 6 7 | пройден |
1 2 3 4 5 6 7 | 10 | 4 5 6 7 1 2 3 | пройден |
Код программы
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 |
class Test { static function main() { var a:Array<Int> = []; var n = Std.parseInt(Sys.stdin().readLine()); var m = Std.parseInt(Sys.stdin().readLine()); for (i in 0...n){ a[i] = Std.parseInt(Sys.stdin().readLine()); } a = shiftArray(a, m); trace(a); } static function shiftArray(a:Array<Int>, m:Int):Array<Int>{ if (m < 0) { throw "Illegal argument exception"; } var shifted:Array<Int> = []; var length = a.length; if (m > length) { m = m % length; trace(m); } for (i in 0...a.length){ shifted[i] = i + m < length ? a[i+m] : a[(i+m)%length]; } return shifted; } } |