面试经典(23)--圆圈中剩下的最后数字
2014-04-21 20:05
288 查看
题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里面删除第m个数字。求这个圆圈里剩下的最后一个数字。
解法1:数组模拟
使用数组来模拟的话空间复杂度和时间复杂度都会比较高,不过为了锻炼下逻辑思维,我们先使用数组。将长度为n的数组初始化0,变量count表示当前退出的人数,只要count=n-1就可以完成任务。t表示报数计数,当t=m时就将数组当前i位置元素置1,表示i位置元素退出,遍历数组遇到元素为1的位置直接跳过。先处理要特殊处理的情况,然后再处理正常逻辑部分。
代码如下:
解法1:数组模拟
使用数组来模拟的话空间复杂度和时间复杂度都会比较高,不过为了锻炼下逻辑思维,我们先使用数组。将长度为n的数组初始化0,变量count表示当前退出的人数,只要count=n-1就可以完成任务。t表示报数计数,当t=m时就将数组当前i位置元素置1,表示i位置元素退出,遍历数组遇到元素为1的位置直接跳过。先处理要特殊处理的情况,然后再处理正常逻辑部分。
代码如下:
//n个人从0--n-1编号,从第一个人报数,数到m的退出. int FindLastOne(int n,int m) { if(n<1 || m<1) return -1; int *data=new int ; memset(data,0,n*sizeof(int)); int t=0,count=0,i=0; while(count<n-1) { if(data[i]==0) t++; if(t==m) { t=0; data[i]=1; ++count; } i++; if(i==n) i=0; } int res; for(i=0;i<n;i++) if(data[i]==0) res=i; delete[] data; return res; }解法2:数学魅力
int lastRemain(int n,int m) { if(n<1 || m<1) return -1; int last=0; for(int i=2;i<=n;i++) last=(last+m)%i; return last; }
相关文章推荐
- 剑指offer面试题目:圆圈中最后剩下的数字(约瑟夫环)
- 圆圈中最后剩下的数字 【微软面试100题 第十八题】
- 面试45:圆圈最后剩下的数字(约瑟夫环)
- 剑指offer-第六章面试中的各项能力(圆圈中剩下的最后数字)
- 面试算法(四十五)圆圈中最后剩下的数字
- 圆圈中最后剩下的数字 【微软面试100题 第十八题】
- 圆圈中剩下的最后数字
- 《剑指Offer》学习笔记--面试题45:圆圈中最后剩下的数字
- 圆圈中最后剩下的数字
- 【剑指offer-Java版】45圆圈中最后剩下的数字
- 面试题45:圆圈中最后剩下的数字(约瑟夫环问题)
- 圆圈中最后剩下的数字
- 圆圈中最后剩下的数字
- 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ
- IT公司100题-18-圆圈中最后剩下的数字
- 《剑指offer》:[45]圆圈中最后剩下的数字(约瑟夫(Josephuse)环问题)
- 45-圆圈中最后剩下的数字
- 剑指 offer set 21 圆圈中最后剩下的数字
- 圆圈中最后剩下的数字
- 【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ