约瑟夫环(CVTE、网易2014.3.16笔试题offerP228)
2014-06-04 14:25
369 查看
题目:0,1,2,……,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
法一:用环形链表模拟圆圈的经典算法(时间复杂度O(nm),空间复杂度O(n))
法二:分析数学规律的高效算法。(时间复杂度O(n),空间复杂度O(1))
http://www.blogjava.net/rorely/archive/2010/01/15/309732.html
法一:用环形链表模拟圆圈的经典算法(时间复杂度O(nm),空间复杂度O(n))
法二:分析数学规律的高效算法。(时间复杂度O(n),空间复杂度O(1))
http://www.blogjava.net/rorely/archive/2010/01/15/309732.html
//约瑟夫环,通过测试 /* OFFER P288:0,1,2,……,n-1这n个数字组成圆圈,从0开始每次从这个圆圈里删除第m个数字。求最后一个剩下的数字 JAVA面宝P194:30个人围成一圈,数到9的人出列,求最后剩下的15个人 */ public class JosephuseRing{ public static void main(String[] args){ int data[]={0,1,2,3,4}; josephuseRing(data,3); } public static void josephuseRing(int data[], int n){ int len=data.length;//初始长度,以后出圈一个,长度就减一 int last=-1; //保存最后一个数 int i=0; //i为元素下表 int j=1; //j代表当前要报的数 while(len>0){ if(data[i%data.length] != -1){//非空位 if(j%n==0){//找到要出圈的人,并把圈中人数减一 //System.out.print(data[i%data.length]+" "); last=data[i%data.length]; data[i%data.length]=-1;//输出后将其值置为-1,即无效值 j=1; i++; len--; }else{ i++; j++; } }else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数 i++; } } System.out.println("the last number is "+last); } }
相关文章推荐
- 扑克牌中的顺子(网易2014.3.16笔试offerP226)
- 一道网易笔试题(加入最优解法)
- (网易2018校招笔试)[编程题] 相反数
- 十月下旬腾讯,网易游戏,百度盛大迅雷校园招聘笔试题集锦(10.25)
- 网易2018届Java校园招聘网申/内推/电话/面试/笔试经验题目
- 网易笔试题
- 网易笔试编程-Fibonacci数列
- 2012网易校园招聘笔试题
- 【网易】2018校招笔试题
- 网易游戏运维笔试题
- 网易2017内推笔试1:地牢逃脱 [python]
- 网易互娱2017在线笔试——题目一:电子数字
- 网易笔试题(一)
- 09网易校园招聘笔试题A卷(研发类笔试题)
- 网易 产品策划( 杭州研究员) 笔试题解
- [面经]CVTE的两道笔试编程题
- 2016网易春招Java在线笔试回忆录
- 网易2016笔试题-----猴子吃桃
- CVTE线上笔试总结
- 2018网易游戏雷火盘古实习生笔试