本次题目来自链接

题目大意是:

给出一个数组,相当于一堆卡牌,每个元素相当于一张牌,每次从卡牌中抽出一张牌,离开牌堆后,下一张牌需要放在牌底。在这种规则下,我们需要确定牌的顺序,来保证这些牌的抽走顺序是升序的。

代码虽然不难,但是思路必须抓得清,我们很容易被把牌塞回牌底这一动作迷惑,其实我们可以把它看作是跳过这一张牌,将其留在原来的位置,然后抽取下一张牌。我们需要做的就是给升序后的数组的每一个元素确定其相应的索引位置。

整体思路是这样子的:

  1. 我们定义一个同样大小的数组result,初始化为0,用于存放结果;
  2. 将待处理的数组进行升序处理得到deck(deck中的元素都是大于0的);
  3. 设置一个全局的放置标志 put = true 和一个全局索引数 i = 0
  4. 遍历deck中的每一个元素,找出这一个元素在新数组中的位置:
    1. 我们确保索引数是循环移动的
    2. 当找到一个位置 i的值为0 & put = true的时候,就完成元素的放置
    3. 当 i 完成放置之后,下一个元素在下一个位置 i + 1就不能放置,所以 put = false,当索引 i = i+ 1时,就会跳过该位置,在这一回中 put = true,保证下一回合能够放置。
    4. 下一个元素必须在 i + 2个放置,在 i + 1的时候,需要令 put = true,完成放置,即重复2~3。

emmmm 还是有点乱,看代码吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vector<int> deckRevealedIncreasing(vector<int> & deck){
vector<int> result(deck.size(), 0);
sort(deck.begin(), deck.end());
bool put = true;
int i = 0;
for auto val : deck:
for (;;i++){
if(i == deck.size())
i = 0;
if(result[i] == 0){
if(put == true){
result[i] = val;
put = false;
break;
}
put = true;
}
}
return result;
}