扑克牌的顺序问题

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

 这里使用双端队列实现比较简单,也容易懂,也可以利用数组实现,数组实现代码略

 

      

  

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值