# ❓ 扑克牌问题

有一堆扑克牌,将牌堆第一张放到桌子上,再将接下来的牌堆的第一张放到牌底,如此往复;

最后桌子上的牌顺序为: (牌底) 1,2,3,4,5,6,7,8,9,10,11,12,13 (牌顶);

问:原来那堆牌的顺序,用函数实现。

# Coding

我们可以先把得到这结果的函数实现,再去逆推。

function shuffle(queue) {
  let _res = [],
    _index = 1,
    _topValue

  while (queue.length) {
    _topValue = queue.shift()
    if (_index % 2) {
      _res.push(_topValue)
    } else {
      queue.push(_topValue)
    }

    _index++
  }

  return _res
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

还原函数

function recover(arr) {
  let _res = [],
    _index = 1

  while (arr.length) {
    if (_index % 2) {
      _res.unshift(arr.pop())
    } else {
      // 重点是这里
      _res.unshift(_res.pop())
    }
    _index++
  }

  return _res
}

// recover([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ])
// [ 1, 12, 2, 8, 3, 11, 4, 9, 5, 13, 6, 10, 7 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19