魔术师手中有一堆扑克牌,观众不知道它的顺序,接下来魔术师: - 从牌顶拿出一张牌, 放到桌子上 - 再从牌顶拿一张牌, 放在手上牌的底部 如此往复(不断重复以上两步),直到魔术师手上的牌全部都放到了桌子上。 此时,桌子上的牌顺序为: (牌顶) 1,2,3,4,5,6,7,8,9,10,11,12,13 (牌底)。 问:原来魔术师手上牌的顺序,用函数实现。
Activity
sisterAn commentedon Jul 8, 2020
感谢 @Eileenxj 的指出,已调整
解答:反向推导
假设,原来魔术师手上牌的顺序数组为
origin,最后放在桌子上的顺序数组为result正向的操作为:
origin取出第一个插入result前面,origin再取出第一个换到自己的末尾,如此重复;反向操作为:
origin最后一个放到自己的第一个前面,result拿出第一个插入origin前面,如此重复;7777sea commentedon Jul 9, 2020
最近刚好在面试里遇到了这道题,说下当时的思路:这是一个已知结果倒推的过程,可以把过程想象为动作的倒放,即:纸牌从桌上返回到手里的过程
原始的扑克牌顺序存放:牌顶 => 牌底 ,用一个数组存放,base=[]
既成现实的桌面纸牌顺序:牌顶 => 牌底,res = [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
正常操作顺序为: base 拿出第一个插入 res 前面, base 再拿出第一个换到自己的末尾, 如此重复
反向的顺序则为:base 最后一个放到自己的第一个前面, res 拿出第一个插入 base 前面, 如此重复
上代码
xyyVee commentedon Jul 9, 2020
“将牌堆第一张放到桌子上,再将接下来的牌堆的第一张放到牌底”,照字面理解的话,我感觉两个数组的第一个数字应该是一样的?因为是先放第一张过去到桌子上,再去换牌堆的顺序?
7777sea commentedon Jul 9, 2020
你可以这么理解,有两个数组,一个是空数组A(桌子),另一个是B数组(牌堆),然后每次从B取出一张牌放到A数组,然后把B数组中的第一位取出来,放到B数组的最后一位
CreatorMr commentedon Jul 14, 2020
你这个不对吧,导不出来呢
CreatorMr commentedon Jul 14, 2020
shens3 commentedon Jul 30, 2020
Eileenxj commentedon Aug 2, 2020
你这个答案是针对 牌顶-》排底的result顺序吧,但是你题目又是说的 排底-》牌顶为 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
VivenZZ commentedon Aug 9, 2020
lbdhr commentedon Dec 31, 2020
我这边写了个输入为牌底 -> 牌顶的~
lewisYe commentedon Apr 16, 2021
function cal(arr){
let old = []
for(let i=arr.length-1;i>=0;i--){
if(old.length){
let num = old.pop()
old.unshift(num)
}
old.unshift(arr[i])
}
return old
}
const result = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
console.log(cal(result)) // [1, 12, 2, 8, 3, 11, 4, 9, 5, 13, 6, 10, 7]
tomorrowIsNewDay commentedon May 18, 2021
`/**
*/
function reverseP(table) {
let arr = []
while(table.length) {
let a = arr.pop()
a && arr.unshift(a)
let val = table.pop()
arr.unshift(val)
}
console.log(arr, 'ad')
return arr
}
reverseP([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
]
`
zhw2590582 commentedon Sep 30, 2021