1. 问题描述:
我手中有一堆扑克牌, 但是观众不知道它的顺序。
第一步, 我从牌顶拿出一张牌, 放到桌子上。
第二步, 我从牌顶再拿一张牌, 放在手上牌的底部。
第三步, 重复前两步的操作, 直到我手中所有的牌都放到了桌子上。
最后, 观众可以看到桌子上牌的顺序是:13,12,11,10,9,8,7,6,5,4,3,2,1
如果给出桌子上的牌的顺序(从上往下看), 请问, 我刚开始拿在手里的牌的顺序是什么?
请用一个完整的函数来实现这一过程。
2.算法解读
这个题的核心点在于:
我从牌顶拿出一张牌, 放到桌子上。
我从牌顶再拿一张牌, 放在手上牌的底部。
重复。
使用逆向思维:
从手上最底部拿出一张牌放在最顶部。
从桌子上最顶部拿出一张牌放在手上最顶部。
重复。
3.代码实现
实现代码如下(包括正向与逆向):
public static void main( String[] args ){
//int data1[]={1,2,3,4};
int data1[]={1,12,2,8,3,11,4,9,5,13,6,10,7};
//正向
for(int de:findSortPositive(data1)){
System.out.print(de+" ");
}
System.out.println();
//逆向
for(int data:findSortInverted(findSortPositive(data1))){
System.out.print(data+" ");
}
}
public static int[] findSortPositive(int[] data){
int [] temp=new int[data.length];
Deque<Integer> deque=new LinkedList<Integer>();
for(int oneData:data){
deque.addLast(oneData);
}
for(int i=0;i<data.length;i++){
temp[data.length-1-i]=(deque.pollFirst());
deque.addLast(deque.pollFirst());
}
return temp;
}
public static int[] findSortInverted(int[] data){
Deque<Integer> deque1=new LinkedList<Integer>();
Deque<Integer> deque=new LinkedList<Integer>();
for(int oneData:data){
deque.addLast(oneData);
}
for(int i=0;i<data.length;i++){
if(!deque1.isEmpty()){
deque1.addFirst(deque1.pollLast());
}
deque1.addFirst(deque.pollFirst());
}
int [] temp=new int[deque1.size()];
int j=0;
while(!deque1.isEmpty()){
temp[j]=deque1.pollFirst();
j++;
}
return temp;
}
这里使用双端队列实现比较简单,也容易懂,也可以利用数组实现,数组实现代码略