输入:
3 2 3 1 2 3 0 1 2
前三个定义数组中元素的数量,数组的旋转次数以及将分别对该数组进行查询的次数。
后三个是数组所包含的数字。
最后三个是在数组上进行的查询,其中array [query]应该是输出
这是我的代码:
>
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int numberElements = in.nextInt();
int numberRotations = in.nextInt();
int numberQuerys = in.nextInt();
int[] a = new int[numberElements];
for(int a_i=0; a_i < numberElements; a_i++){
a[a_i] = in.nextInt();
}
for(int a0 = 0; a0 < numberQuerys; a0++){
int indexQuery = in.nextInt();
for(int rotateQuery = 1; rotateQuery < numberRotations; rotateQuery++){
if(indexQuery == numberRotations){
indexQuery = 0;
}
else{
indexQuery++;
}
}
System.out.print(a[indexQuery]);
if(a0 != numberQuerys){
System.out.print("\n");
}
}
}
为什么我遇到大输入问题?
答案 0 :(得分:0)
您遇到了问题,因为当indexQuery
到达numberRotations
时,您将numberElements
重新归零,但是当它到达numberRotations
时( < / em>递增),这是您的数组的大小。如果没有,如果numberElements
大于rotateQuery
,您最终可能会从数组末尾开始阅读。
另一个问题是你应该从0开始计算numberRotations
,否则你会比你想要的少一轮,因为循环运行的时间小于 { {1}}不小于或等于。您可以通过调试器进行验证,我建议您这样做。
更有效的方法是将numberRotations
添加到索引并使用模运算符来处理包装,而不是循环:
indexQuery = (indexQuery + numberRotations) % numberElements;
这假定numberRotations
为正,因此您也应该为此添加输入验证检查。
答案 1 :(得分:0)
3 1 3 1 2 3 0 1 2
,输出应为:
3 1 2
和你的输出
1 2 3
另一种解决方案是替换循环:
for(int rotateQuery = 1; rotateQuery < numberRotations; rotateQuery++){
if(indexQuery == numberRotations){
indexQuery = 0;
}
else{
indexQuery++;
}
}
带
indexQuery = (indexQuery - numberRotations%numberElements+ numberElements) % numberElements;
因为旋转查询与旋转数组元素相反所以我们应该减去 numberRotations 而不是添加。