# ❓ 扑克牌问题
有一堆扑克牌,将牌堆第一张放到桌子上,再将接下来的牌堆的第一张放到牌底,如此往复;
最后桌子上的牌顺序为: (牌底) 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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19