首页 > 编程语言 > 详细

一个有趣的算法题

时间:2018-04-28 10:31:41      阅读:460      评论:0      收藏:0      [点我收藏+]

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

题目:

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

  

一个有趣的算法题

原文:https://www.cnblogs.com/youhongpp/p/8965654.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!