var a = [1, 2, 3, 4, 5];
function f(a){
let b = [],
c = [...a],
len = a.length;
for(let i = 0; i < len; i++){
b.push(c.pop());
c.unshift(c.pop());
}
return b;
}
f(a); // b ==> [5, 3, 1, 2, 4];
var a = [5, 3, 1, 2, 4];
function f(a){
let b = [],
c = [...a],
len = a.length;
for(let i = 0; i < len; i++){
b.push(c.pop());
b.push(b.shift());
}
b.unshift(b.pop());
return b;
}
f(a); // b ==> [1, 2, 3, 4, 5]
最后规范一下命名,增强可读性。
/**
* Input 拿出牌的顺序 1,2,3,4,5,6,7,8,9,10,11,12,13
* Output 牌堆原来的顺序
*/
function getCardsOrder(input){
let output = [],
copyInput = [...input],
len = input.length;
for(let i = 0; i < len; i++){
output.push(copyInput.pop());
output.push(output.shift());
}
output.unshift(output.pop());
return output;
}
背景
手中有一堆扑克牌, 不知道它的顺序。 第一步, 从牌顶拿出一张牌, 放到桌子上。 第二步, 从牌顶再拿一张牌, 放在手上牌的底部。 第三步, 重复第一步、第二步的操作, 直到手中所有的牌都放到了桌子上。 最后, 桌子上牌的顺序是:(牌底部)1,2,3,4,5,6,7,8,9,10,11,12,13(牌顶部) 请问, 刚开始拿在手里的牌的顺序是什么?
思路:
首先,这扑克牌问题主要考察逆向思维,就是先告诉我们结果,然后让我们顺藤摸瓜,一步一步到达开始。
写个简单例子:
这个例子是按照正向思维实现的,可是题目的要求,只给到我们
b
的的值,a
的值是不知道的,有点像数学里面的求解函数。因此,我们只需要调整for
循环里面的取值顺序,就能轻松解开。