笔试算法题(11):Josephus环 & Fibonacci序列
出题: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序列的更多相关文章
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- 小小c#算法题 - 11 - 二叉树的构造及先序遍历、中序遍历、后序遍历
在上一篇文章 小小c#算法题 - 10 - 求树的深度中,用到了树的数据结构,树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集.但在那篇文章中,只 ...
- 每天一道算法题(11)——栈的push、pop 序列
题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的. 例如:输入的push 序列是 ...
- 笔试算法题(34):从数字序列中寻找仅出现一次的数字 & 最大公约数(GCD)问题
出题:给定一个数字序列,其中每个数字最多出现两次,只有一个数字仅出现了一次,如何快速找出其中仅出现了一次的数字: 分析: 由于知道一个数字异或操作它本身(X^X=0)都为0,而任何数字异或操作0都为它 ...
- 笔试算法题(27):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等
出题:判断一个单向链表是否有环,如果有环则找到环入口节点: 分析: 第一个问题:使用快慢指针(fast指针一次走两步,slow指针一次走一步,并判断是否到达NULL,如果fast==slow成立,则说 ...
- 笔试算法题(15):-1到N中包含1的数字的个数 & 连续和为N的序列
出题:输入一个整数N,求从1到N这N个整数的十进制表示中‘1’出现的次数: 分析: 从左向右处理string表示的数字:当前数字长度为n,判断最左边一位数字字符: 如果是0,则直接递归下一位: 如果是 ...
- 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应
出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...
- 笔试算法题(03):最小第K个数 & 判定BST后序序列
出题:输入N个整数,要求输出其中最小的K个数: 分析: 快速排序和最小堆都可以解决最小(大)K个数的问题(时间复杂度为O(NlogN)):另外可以建立大小为K的最大堆,将前K个数不断插入最大堆,对于之 ...
- 笔试算法题(30):从已排序数组中确定数字出现的次数 & 最大公共子串和最大公共序列(LCS)
出题:在已经排序的数组中,找出给定数字出现的次数: 分析: 解法1:由于数组已经排序,所以可以考虑使用二分查找确定给定数字A的第一个出现的位置m和最后一个出现的位置n,最后m-n+1就是A出现的次数: ...
随机推荐
- Uncaught ReferenceError: is not defined
今天,遍历一个HashSet集合对象,想用链接绑定集合对象的值,通过POST方式提交到控制器.结果程序无反应,按F12键进入调试模式,谷歌总是提示Uncaught ReferenceError: ...
- (转)理解POCO
POCO的概念是从java的POJO借用而来,而两者的含义是一致的,不同的仅仅是使用的语言不一样.所以POCO的解释就是“Plain Old C# Object”. 从字面上翻译为“纯洁老式的C#对象 ...
- centos 6.2 pptp 客户端 安装(转载)
转自:http://www.lnmpblog.com/archives/611 centos 6.2 64.bit的桌面版本.配置vpn客户端. 步骤: 1.yum -y install pptp 2 ...
- 【WIP】Objective-C Foundation框架的主要对象
创建: 2018/02/02 完成字符串: 2018/02/05 任务表: TODO 最新内容确认: 字符串,数据类, 数组类 可变与不变的对象 一览 种类 不变类 可变类 数组 NSA ...
- JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】
JavaScript实现对象的深度克隆 代码实现如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- Uix Kit 快速建站前端开发套件-工具箱
这个产品维护已经有一年了(由于业务需求不同,目前没有做中文版,产品本身是针对国外网站),自己本身是做UI出生,开发只是业余爱好,仅仅作为平时工作的需要.杂七杂八会一些前后端开发.并非职业码农! 我是一 ...
- 数字货币期货与现货JavaScript量化策略代码详解汇总
1.动态平衡策略 按照当前的 BTC 的价值,账户余额保留¥5000 现金和 0.1个 BTC,即现金和BTC 市值的初始比例是 1:1. 如果 BTC 的价格上涨至¥6000,即 BTC 市值大于账 ...
- JS 自写datapage.js 通用分页
var Page = function () { }; Page.prototype = { Loading: "<img src='/Content/Scripts/Data ...
- Unix\Linux | 总结笔记 |文件系统
1. ls [选项] [文件] 显示目录中的文件信息 -a 显示全部文件(包括隐藏文件) -l 查看文件的属性.大小等详细信息 (ls -l 详解) -al 查看当前目录中 ...
- import android.support.v4或者import android.support.v7提示导入错误解决办法
转自: http://blog.csdn.net/forandever/article/details/37655139 在使用Eclipse开发andriod程序时,程序中提示import and ...