Reveal Cards In Increasing Order


In a deck of cards, every card has a unique integer.  You can order the deck in any order you want.

Initially, all the cards start face down (unrevealed) in one deck.

Now, you do the following steps repeatedly, until all cards are revealed:

  1. Take the top card of the deck, reveal it, and take it out of the deck.
  2. If there are still cards in the deck, put the next top card of the deck at the bottom of the deck.
  3. If there are still unrevealed cards, go back to step 1.  Otherwise, stop.

Return an ordering of the deck that would reveal the cards in increasing order.

The first entry in the answer is considered to be the top of the deck.

 

Example 1:

Input: [17,13,11,2,3,5,7]
Output: [2,13,3,11,5,17,7]
Explanation: 
We get the deck in the order [17,13,11,2,3,5,7] (this order doesn't matter), and reorder it.
After reordering, the deck starts as [2,13,3,11,5,17,7], where 2 is the top of the deck.
We reveal 2, and move 13 to the bottom.  The deck is now [3,11,5,17,7,13].
We reveal 3, and move 11 to the bottom.  The deck is now [5,17,7,13,11].
We reveal 5, and move 17 to the bottom.  The deck is now [7,13,11,17].
We reveal 7, and move 13 to the bottom.  The deck is now [11,17,13].
We reveal 11, and move 17 to the bottom.  The deck is now [13,17].
We reveal 13, and move 17 to the bottom.  The deck is now [17].
We reveal 17.
Since all the cards revealed are in increasing order, the answer is correct.

 

Note:

  1. 1 <= A.length <= 1000
  2. 1 <= A[i] <= 10^6
  3. A[i] != A[j] for all i != j

 

题目理解:

定义一种数组的读取顺序:取出数组的第一个数字,将第二个数字挪到数组的最后。给定一个数组,改变它的顺序,使得它在给定的读取顺序下读取数来之后,是递增排序的。

解题思路:

利用一个队列模仿读取顺序。

首先在队列里面按顺序放好0 ~ n-1的数字,然后按照给定读取顺序读出来,讲队列里面的元素理解为数组元素的下标,换句话说,我们把原数组里面第n大的数字放到从队列中读取的第n个位置上,那么读取出来这个数字就在它应有的位置上。

class Solution {
    public int[] deckRevealedIncreasing(int[] deck) {
        Queue qu = new LinkedList<>();
        int len = deck.length;
        for(int i = 0; i < len; i++)
            qu.offer(i);
        List list = new ArrayList<>();
        while(!qu.isEmpty()){
            list.add(qu.poll());
            if(!qu.isEmpty())
                qu.offer(qu.poll());
        }
        Arrays.sort(deck);
        int[] res = new int[len];
        for(int i = 0; i < len; i++)
            res[list.get(i)] = deck[i];
        return res;
    }
}

 

你可能感兴趣的:(LeetCode)