扑克牌的顺序问题
? ?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;}?這里使用雙端隊列實現比較簡單,也容易懂,也可以利用數組實現,數組實現代碼略
?
? ? ??
??
?
?
?
總結
- 上一篇: 织梦屏蔽广告法极限词和敏感词插件【防职业
- 下一篇: 点下确认的那一刻,我的大脑在发生些什么?