-
题目:
资源限制
内存限制:256.0MB Java时间限制:3.0s
问题描述
初始数组A[N]中为1,2,..,N,N个数字,现要进行M次操作,每次操作给定一个数字i,记其在数组中的位置为Bi,将A[1]..A[Bi]移到数组末尾。
输入格式
输入的第一行包含两个整数N,M。接下来M行,每行一个正整数,表示给定的数字i。
输出格式
一行,输出M次操作后的A数组。
样例输入
5 2
3
2样例输出
3 4 5 1 2
-
思路:
- 这题其实题目说输出m次操作后的数组,但是答案结果是输出最后一次移动的结果。
- 按照我的理解来的话,题目所说的将A[1]..A[Bi]移到数组末尾其实就是以Bi为界,将每一个数左移Bi位。
- 左移就是将左Bi的数反转,右N-Bi反转,最后再将整个数组N反转。
-
代码:
package BlueBridge;
import java.util.Scanner;
public class ArrayMove {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] nums = new int[n];
int[] orders = new int[m];
for (int i = 0; i < nums.length; i++) {
nums[i] = i+1;
}
for (int i = 0; i < orders.length; i++) {
orders[i] = in.nextInt();
}
// for (int i = 0; i < orders.length; i++) {
move(nums,orders[orders.length-1]);
// }
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + " ");
}
in.close();
}
private static void move(int[] nums, int order) {
reverse(nums,0,order-1);
reverse(nums,order,nums.length-1);
reverse(nums,0,nums.length-1);
}
private static void reverse(int[] nums, int s,int e) {
for (int i = s,j=e; i <j ; i++,j--) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
(有错误欢迎指正哈,如果有不小心侵权的联系删除哈😁)