一个有趣的算法题
Posted 走走停停
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个有趣的算法题相关的知识,希望对你有一定的参考价值。
以下解题方法来自于他人!
题目:
一副牌,序号从1到n,每次从牌堆顶部拿出一张牌放在桌子上,并将下一张牌放到牌堆地下,依次循环,最终在桌子上的牌从1到n的有序。设计程序实现
1、模拟这个过程:
建立一个队列,将数字1到n依次入队,作为牌堆中从牌堆顶部到最后一张牌的次序。按照题意从数组中取数,比如拿出第一张牌,即从队列头部取出1放入临时数组t中,并取出数字2放进队列末尾,依次进行,直至队列为空。此时得到的数组t即为取牌的次序。根据题意,按照此顺序得到的牌的序号应该是从1到n有序的。
将t中的元素作为另一个数组的下标,且按照数组t中元素的次序,得到的集合应该是有序的。
例如:n=5
按照上述方法得到的数组t={1,3,5,4,2},设另一个数组为p,将t中元素作为p的下标,按照下标依次从p中取值,得到的集合应该是从1到n有序的,即:
t值(p下标) p值
1 --------------------> 1
3 --------------------> 2
5 --------------------> 3
4 --------------------> 4
2 --------------------> 5
所以将p值按照t值的下标映射,就可以得到原牌堆中牌的序号,即得到{1,5,2,4,3}。
代码如下:
func intrest(n int){ l := list.New() for i:=0;i<n;i++{ l.PushBack(i+1) } tmp := make([]int, 0) for l.Len()>0{ a := l.Front() tmp = append(tmp, a.Value.(int)) l.Remove(a) if l.Len()==0{ break } b := l.Front() l.Remove(b) l.PushBack(b.Value.(int)) } p := make([]int, n) for i:=0;i<n;i++{ p[tmp[i]-1] = i+1 } fmt.Println(p) }
以上是关于一个有趣的算法题的主要内容,如果未能解决你的问题,请参考以下文章