一个有趣的算法题

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

题目:

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

时间: 2024-08-07 06:47:39

一个有趣的算法题的相关文章

一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串

       By Long Luo 最近遇到一个算法题: 仿照Excel的列编号,给出一个数字,输出该列编号字符串. 例如:A对应1,Z对应26,AA对应27,AZ对应52 ...... 这个题目是一个典型的26进制思路去处理,但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近1个小时的编写,完成的代码如下: C++代码如下: #include <iostream> #include <string.h> using namespace std; /

一道有趣的算法题。。。

题目意思: 用1, 2, 3 ,4 ,5, 6, 7, 8, 9 组成3个三位数 abc, def 和 ghi, 每个数字恰好使用一次,要求abc:def:ghi = 1:2:3.输出所有解. 分析: 模拟所有三位数,判断条件有二: 一.i(abc):j(def):k(ghi)=1:2:3 二.判断是否出现的1~9之间的所有数字 代码: /** *一道有趣的算法题 * */ #include<iostream> #include<cstdio> using namespace st

【面试题】一个号称BAT算法题

[我也带来一波节奏]既然想reroll码农的这么多,那来做个游戏吧,真实BAT面试 http://bbs.ngacn.cc/read.php?tid=8405951 发这个没有别的意思有很多转行/自学/经验少的旁友很好奇真正的面试题是什么样子的,也想检验下自己什么水平正好最近朋友给我看了这个真实的例子,就发来给大家看看本题不涉及任何特定的算法,数学与专门的理论知识考察的是基本的逻辑思维,抽象思维,基本的算法分析与动手能力 如图有限状态机A,B,C三个状态从左边start进入A开始运行,到达最右边

一个有趣的算法题目

一天晚上(2018.3.28),老大根据业务需要在群里出了这么一个问题,题目是这样的: 考虑一个场景,有6个人为一个教练打分,最低一个星(1分),最高5个星(5分),六个人打完分之后,求一个平均分,问这个教练可能拿到的平均分有多少种情况. 群里面一共有4个人,除了老大以外,还有后端小哥A,后端小哥B和我.然后我们分别给出了三种方法. 我的方法 -- 六重循环?? 我给出了一个简单粗暴的方法,就是六重循环大法,大概长这个样子: let average = []; for(var f=1;f<6;f

碰到的一个简单的算法题,关于两个字符串word1和word2,判断word1能不能只通过删除字符就能够得到word1.

这是我写的一个解法,大概思路是说.首先判断如果word2的长度大于word1则直接返回false,负责继续执行. 我们判断在word2中的每一个字符在word1中出现的位置,如果刚好符合word1中的全部或者部分字符的组成顺序那么就符合返回true. 具体的代码实现如下: static boolean isTrans(String word1,String word2){ if(word2==null || word2.length()==0) return true; if(word1 ==

一个简单有趣的证明题

最近上算法课,老师讲了一个有趣的证明题. 平面上一个有n个点的有限点集A.具有如下性质:任意两个点x,y所决定的直线上都能找到第三个点z.试证明A中的所有点在同一直线上. 对于证明题来说,最常用而系统的方法无非就两种:归纳法和反证法.其他的诸如综合法和分析法都与具体问题关系较大.如果解决证明题一时没有思路,这两种方法将是不错的选择.下面将尝试用这两种方法解决这个题目. 一,归纳法. 相信学过高中数学的人,没有人不知道这个大名鼎鼎,而又简单有效的证明方法.这里就不再赘述.下面给出一个证明过程. (

常见算法题合辑(一)

这一章的内容,有些之前已经在微信公众号中将详细的思路及步骤汇总过,有些之后可能会再找时间对其进行分析,这里只将最终实现罗列出来,难易程度不分先后,算法复杂度不保证是最优,留给大家空间自行思考,当然,本章用的是C#语言进行编码,大家可以使用自己熟悉的语言将这些算法实现一遍哦~ 如果你有什么有趣的算法题或者没能解决的算法题,也可以留言给小编,让我们一起玩转算法~ 1. 冒泡排序 这个算是所有算法中最为简单的了,实现方法如下: 2. 插入排序 从排序算法来看,这个算法也是属于比较简单的了,实现方法如下

LeetCode算法题-Min Stack(Java实现)

这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小元素的堆栈. push(x) - 将元素x推入堆栈. pop() - 删除堆栈顶部的元素. top() - 获取顶部元素. getMin() - 检索堆栈中的最小元素. 例如: MinStack minStack = new MinStack(); minStack.push(-2); minSta

LeetCode算法题-Reverse Bits(Java实现)

这是悦乐书的第185次更新,第187篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第44题(顺位题号是190).给定32位无符号整数,求它的反转位.例如: 输入:43261596 输出:964176192 说明:43261596以二进制表示为00000010100101000001111010011100, 964176192以二进制表示为00111001011110000010100101000000. 本次解题使用的开发工具是eclipse,jdk使用的版本是1