在奇数索引处反转队列中的数字

时间:2014-03-13 04:23:20

标签: java numbers stack

这是一个复习问题(不要求HW答案!!!)

编写一个方法reverseHalf,它反转整数队列的一半元素的顺序。假设队列中的第一个值的位置为0,那么您的方法应该颠倒奇数位置(位置1,3,5等)中所有元素的顺序。例如,如果队列最初存储了这个数字序列调用方法时:

指数:0 1 2 3 4 5 6 7 前面[1,8,7,2,9,18,12,0]回来了 - 它应该在方法执行完毕后存储以下值:

指数:0 1 2 3 4 5 6 7 前面[1,0,7,18,9,2,12,8]回来了 请注意,偶数位置(位置0,2,4,6)的数字没有移动。那个数字的子序列仍然是:(1,7,9,12)。但请注意,奇数位置(位置1,3,5,7)的数字现在与原始位置的数字相反。换句话说,原始子序列:(8,2,18,0) - 变为:(0,18,2,8)。您可以使用单个堆栈作为辅助存储。

我已经让它在我的队列中使用了偶数个元素,但是当涉及到一个奇数时我迷失了....我是否必须重新构建我的整个程序?或者这是快速解决方案之一?

我的代码:

public static void reverseHalf(Queue<Integer> q){
    int size = q.size();
    Stack<Integer> s = new Stack<Integer>();


    for(int i = 0; i < size; i++){
        int n = q.remove();
        s.push(n);
        q.add(n);
    }
    for(int i = 0; i < size; i++){
        int n = q.remove();
        if(i % 2 == 0){
            q.add(n);
        }
    }

    for(int i = 0; i < size; i++){
        int n = s.pop();
        if(i % 2 == 0)
        q.add(n); 
    }

    for(int i = 0; i < size; i++){
        int n = q.remove();
        s.push(n);
        q.add(n);
    }

    for(int i = (size / 2); i < size; i++){
        q.remove();
    }

    for(int i = 0; i < (size / 2); i++){
        s.pop();
    }

    for(int i = 0; i < size / 2; i++){
        q.add(s.pop());
    }

    s.clear();

    for(int i = 0; i < size; i++){
        int n = q.remove();
        s.push(n);
        q.add(n);
    }

    for(int i = 0; i < (size  / 2); i++){
        int n = s.pop();
        int m = q.remove();
        q.add(n);
        q.add(m);
    }

    for(int i = 0; i < (size / 2); i++){
        q.remove();
    }


}

2 个答案:

答案 0 :(得分:1)

首先,您需要替换所有

i % 2 == 0

i % 2 != 0

以上是奇数的定义。第二个技巧在于包含

的所有行
for(int i = 0; i < (size  / 2); i++)

你应该能够轻松搞清楚这一点。

答案 1 :(得分:0)

将i初始化为1,将j初始化为最后一个奇数索引。在这些索引处交换元素。将i递增2并将j递减2直到j小于i。我认为这应该会奏效。