wuyongyu / fe-knowledge

📚积累前端知识
2 stars 0 forks source link

扑克牌问题 #7

Closed wuyongyu closed 5 years ago

wuyongyu commented 5 years ago

背景

手中有一堆扑克牌, 不知道它的顺序。 第一步, 从牌顶拿出一张牌, 放到桌子上。 第二步, 从牌顶再拿一张牌, 放在手上牌的底部。 第三步, 重复第一步、第二步的操作, 直到手中所有的牌都放到了桌子上。 最后, 桌子上牌的顺序是:(牌底部)1,2,3,4,5,6,7,8,9,10,11,12,13(牌顶部) 请问, 刚开始拿在手里的牌的顺序是什么?


思路:

首先,这扑克牌问题主要考察逆向思维,就是先告诉我们结果,然后让我们顺藤摸瓜,一步一步到达开始。

写个简单例子:

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];

这个例子是按照正向思维实现的,可是题目的要求,只给到我们b的的值,a的值是不知道的,有点像数学里面的求解函数。因此,我们只需要调整for循环里面的取值顺序,就能轻松解开。

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;
}