这是一个复习问题(不要求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();
}
}
答案 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。我认为这应该会奏效。