一个有趣的算法题

以下解题方法来自于他人!

题目:

一副牌,序号从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 

扫描二维码关注公众号,回复: 82986 查看本文章

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

  

猜你喜欢

转载自www.cnblogs.com/youhongpp/p/8965654.html