尝试通过旋转查询而不是数组

时间:2017-02-08 03:32:04

标签: java algorithm

输入:

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");
        }

    }
}

为什么我遇到大输入问题?

2 个答案:

答案 0 :(得分:0)

您遇到了问题,因为当indexQuery到达numberRotations时,您将numberElements重新归零,但是当它到达numberRotations时( < / em>递增),这是您的数组的大小。如果没有,如果numberElements大于rotateQuery,您最终可能会从数组末尾开始阅读。

另一个问题是你应该从0开始计算numberRotations,否则你会比你想要的少一轮,因为循环运行的时间小于 { {1}}不小于或等于。您可以通过调试器进行验证,我建议您这样做。

更有效的方法是将numberRotations添加到索引并使用模运算符来处理包装,而不是循环:

indexQuery = (indexQuery + numberRotations) % numberElements;

这假定numberRotations为正,因此您也应该为此添加输入验证检查。

答案 1 :(得分:0)

正如@samgak所说,似乎你的算法存在缺陷: 更改输入并使其旋转一次,输入为:

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 而不是添加