出题:Josephus Cycle,约瑟夫环问题。k个数字连成一个环,第一个数字为1。首先从1开始计数删除第m个数字;然后从上次被删除的数字的下一个数字开始计数,删除第m个数字;重复进行第二步直到只剩下一个数字;输出最后剩下的一个数字;

分析:

  • 解法1:考虑到问题的特殊性,可以使用哑元素表示删除的元素从而避免由于删除元素带来的额外操作,所以链表实现的话不用考虑删除操作,数组实现的话不用考虑内存移动操作。当然完全可以不适用哑元素,对于链表而言可以节省查找时间,数组的话需要增加数组元素的平移开销;
  • 解法2:直接使用数学推导,设最终剩下的数字为f(k,m),其中(k为所有数字个数,m为跨距),可以推导当k=1时,f(k,m)=0;当k>1时,f(k,m)=[f(k-1,m)+m]%k。具体推导过程可以参考网页:(其实推导过程可以更简单)
    http://zhedahht.blog.163.com/blog/static/2541117420072250322938/

解题:

 struct Node {
int v;
Node *next;
};
/**
* 哑元素为-1
* 简单起见总长度缺省为8,m为指定的跨距
* */
int ListJose(int m) {
Node* b1=new Node(); b1->v=;
Node* b2=new Node(); b2->v=;b1->next=b2;
Node* b3=new Node(); b3->v=;b2->next=b3;
Node* b4=new Node(); b4->v=;b3->next=b4;
Node* b5=new Node(); b5->v=;b4->next=b5;
Node* b6=new Node(); b6->v=;b5->next=b6;
Node* b7=new Node(); b7->v=;b6->next=b7;
Node* b8=new Node(); b8->v=;b7->next=b8; b8->next=b1; Node *current=b1, *temp;
int count; while(true) {
/**
* 每删除一个数字都需要重设count
* */
count=;
temp=current->next;
/**
* 这个循环用于寻找从current开始计数
* 的第m个数
* */
while(true) {
if(temp->v != -) {
count++;
}
if(count == m) break;
temp=temp->next;
}
/**
* 此时temp索引的就是需要删除的第m
* 个数
* */
temp->v=-;
/**
* 这个循环用于寻找被删除元素的下一个元素
* 注意需要是非-1值的节点
* */
temp=temp->next;
while(temp->v == -) {
temp=temp->next;
}
/**
* 此时temp索引的就是下一个可计数的元素,但是
* 检查其是否就是current本身,是的话说明已经
* 只有一个元素;否则更新current,进入下一次
* 循环
* */
if(temp == current) break;
else current=temp;
}
return current->v;
}
/**
* 数组的实现与链表类似,不过需要使用%取模操作符使得数组变成循环
* 结构
* */
int ArrayJose(int m) {}

出题:Fibonacci数列定义如下,要求用O(N)的时间找到第n个元素,O(logN)呢
            0          n=0
      f(n) = 1       n=1
             f(n-1)+f(n-2)   n>=2

分析:

  • 解法1:如果使用Top Down的分解方式,f(n)=f(n-1)+f(n-2), n>=2,这样下一层需要处理的项变成2n-3,再下一层变成4n-12,6n-17,……,树的总深度为n,时间复杂度为O(N3),此策略最大的缺点在于重复计算;
  • 解法2:如果使用Bottom Up的分解方式,所以BU可以利用n-1和n-2的结果计算n,时间复杂度为O(N),基本满足要求。因此使用递归实现并不一定适合递归形式定义的命题;
  • 解法3:利用矩阵性质:{f(n), f(n-1), f(n-1), f(n-2)}={1, 1, 1, 0}n-1,可以在O(logN)的时间复杂度下求得结果,具体思路请参见:
    http://zhedahht.blog.163.com/blog/static/25411174200722991933440/

解题:

 double Fibonacci(double n) {
double first=0.0;
double second=1.0;
double current=0.0; for(int i=;i<=n;i++) {
current=first+second; first=second;
second=current;
} return current;
}

笔试算法题(11):Josephus环 & Fibonacci序列的更多相关文章

  1. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...

  2. 小小c#算法题 - 11 - 二叉树的构造及先序遍历、中序遍历、后序遍历

    在上一篇文章 小小c#算法题 - 10 - 求树的深度中,用到了树的数据结构,树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集.但在那篇文章中,只 ...

  3. 每天一道算法题(11)——栈的push、pop 序列

    题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的. 例如:输入的push 序列是 ...

  4. 笔试算法题(34):从数字序列中寻找仅出现一次的数字 & 最大公约数(GCD)问题

    出题:给定一个数字序列,其中每个数字最多出现两次,只有一个数字仅出现了一次,如何快速找出其中仅出现了一次的数字: 分析: 由于知道一个数字异或操作它本身(X^X=0)都为0,而任何数字异或操作0都为它 ...

  5. 笔试算法题(27):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等

    出题:判断一个单向链表是否有环,如果有环则找到环入口节点: 分析: 第一个问题:使用快慢指针(fast指针一次走两步,slow指针一次走一步,并判断是否到达NULL,如果fast==slow成立,则说 ...

  6. 笔试算法题(15):-1到N中包含1的数字的个数 & 连续和为N的序列

    出题:输入一个整数N,求从1到N这N个整数的十进制表示中‘1’出现的次数: 分析: 从左向右处理string表示的数字:当前数字长度为n,判断最左边一位数字字符: 如果是0,则直接递归下一位: 如果是 ...

  7. 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应

    出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...

  8. 笔试算法题(03):最小第K个数 & 判定BST后序序列

    出题:输入N个整数,要求输出其中最小的K个数: 分析: 快速排序和最小堆都可以解决最小(大)K个数的问题(时间复杂度为O(NlogN)):另外可以建立大小为K的最大堆,将前K个数不断插入最大堆,对于之 ...

  9. 笔试算法题(30):从已排序数组中确定数字出现的次数 & 最大公共子串和最大公共序列(LCS)

    出题:在已经排序的数组中,找出给定数字出现的次数: 分析: 解法1:由于数组已经排序,所以可以考虑使用二分查找确定给定数字A的第一个出现的位置m和最后一个出现的位置n,最后m-n+1就是A出现的次数: ...

随机推荐

  1. Extjs 4 MVC中全局配置文件

    Extjs 4 Config和Mixins http://kldn.iteye.com/blog/1386622 http://www.fengfly.com/html/JavaScript/ExtJ ...

  2. Tinkoff Challenge - Elimination Round C. Mice problem(模拟)

    传送门 题意 给出一个矩形的左下角和右上角的坐标,给出n个点的初始坐标和运动速度和方向,询问是否存在一个时间使得所有点都在矩形内,有则输出最短时间,否则输出-1 分析 对于每个点如果运动过程中都不在矩 ...

  3. Douglas-Peucker 轨迹压缩算法

    算法的基本思路是:     对每一条曲线的首末点虚连一条直线,求所有点与直线的距离,并找出最大距离值dmax ,用dmax与限差D相比:     若dmax <D,这条曲线上的中间点全部舍去; ...

  4. 8.20~8.25刷散题记录 By cellur925

    记录一些散题 / 价值不大但还是想记下来的题目 / 没正八经写博客的题目 8.24 Luogu P1508 沙雕题数字三角形的二维升级版,但是注意阅读理解,李大水牛从桌子最后一行下侧开始吃,而本题是自 ...

  5. POJ2482 Stars in Your Window(扫描线+区间最大+区间更新)

    Fleeting time does not blur my memory of you. Can it really be 4 years since I first saw you? I stil ...

  6. [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】

    传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...

  7. 设置UITableViewCell 选中时的背景颜色

    自定义Cell如图 一个View上面放了四个Label 分别连线到.m文件中 @property (weak, nonatomic) IBOutlet UILabel *nameLabel; @pro ...

  8. jmeter(十五)Jmeter默认报告优化

    一.本文目的: 之前写了两篇文章搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)和ANT批量执行Jmeter脚本,功能实现上都没有什么问题,但是最后生成的报告有一点小问题,虽然不影响使 ...

  9. [转]在ubuntu上安装chrome浏览器

    原文链接: https://www.linuxidc.com/Linux/2013-10/91857.htm --------------------------------------------- ...

  10. java visualVM 使用

    下载jdk 一般自带  jvisualvm.exe ,双击即可   下载地址   https://visualvm.github.io/pluginscenters.html 使用方法: