面试题45:圆圈中最后剩下的数字
题目:0,1,…,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。

❖ 经典的解法,用环形链表模拟圆圈

代码如下:

#include <iostream>
#include <list>
using namespace std;int LastRemaining(unsigned int n, unsigned int m)
{if (n < 1 || m < 1) return -1;list<int>numbers;for (int i = 0; i < n; i++)numbers.push_back(i);list<int>::iterator current = numbers.begin();while (numbers.size() > 1){for (int i = 1; i < m; i++){current++;if (current == numbers.end()) current = numbers.begin();}list<int>::iterator next = ++current;if (next == numbers.end()) next = numbers.begin();--current;numbers.erase(current);current = next;}return *(current);
}

❖ 创新的解法,拿到Offer不在话下

代码如下:

#include <iostream>
using namespace std;int josephus(int n, int m)
{if (n == 1) return 0;else return (josephus(n - 1, m) + m) % n;
}

测试用例:
● 功能测试(输入的m小于n,比如从最初有5个数字的圆圈删除每次第2、3个数字;输入的m大于或者等于n,比如从最初有6个数字的圆圈删除每次第6、7个数字)。
● 特殊输入测试(圆圈中有0个数字)。
● 性能测试(从最初有4000个数字的圆圈中每次删除第997个数字)。
本题考点:
● 考查抽象建模的能力。不管应聘者是用环形链表来模拟圆圈,还是分析被删除数字的规律,都要深刻理解这个问题的特点并编程实现自己的解决方案。
● 考查对环形链表的理解及应用能力。大部分面试官只要求应聘者基于环形链表的方法解决这个问题。
● 考查数学功底及逻辑思维能力。少数对算法和数学基础要求很高的公司,面试官会要求应聘者不能使用 O(n)的辅助内存,这个时候应聘者就只能静下心来一步步推导出每次删除的数字有哪些规律。

[剑指offer]面试题45:圆圈中最后剩下的数字相关推荐

  1. 剑指Offer - 面试题62. 圆圈中最后剩下的数字(约瑟夫环 递推公式)

    1. 题目 0,1,-,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次 ...

  2. 剑指offer 面试题62. 圆圈中最后剩下的数字

    0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字 ...

  3. 《剑指Offer》62:圆圈中最后剩下的数字(约瑟夫环)

    题目 0,1,2-,n-1这n个数字排成一个圆圈,从数字0开始,每次从这圆圈你删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第 ...

  4. 【剑指offer-Java版】45圆圈中最后剩下的数字

    圆圈中最后剩余的数字:约瑟夫环问题 0-n这n个数字排成一圈,从数字零开始每次从这个圆圈中删除第m个数字,求出剩余的最后一个数字 public class _Q45<T> {// 低效的模 ...

  5. 剑指offer第62题 圆圈中最后剩下的数字(约瑟夫问题)

    文章目录 问题描述: 解题思路: 代码实现: 问题描述: 0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3. ...

  6. 【剑指offer】62、圆圈中最后剩下的数字

    题目 0~n-1这n个数字排成一个圆圈,从0开始,每次删除第m个数字,求出圆圈里剩下的最后一个数字 思路 直接用数组模拟圆圈,模拟删除的过程 class Solution { public:int L ...

  7. 剑指offer:孩子们的游戏(圆圈中最后剩下的数)

    题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...

  8. 剑指offer——面试题45:圆圈中最后剩下的数字(孩子们的游戏)

    剑指offer--面试题45:圆圈中最后剩下的数字(孩子们的游戏) Solution1: 当年第一遍做时,自己想的垃圾算法 class Solution { public:int LastRemain ...

  9. 剑指offer——面试题8:旋转数组的最小数字

    剑指offer--面试题8:旋转数组的最小数字 Solution1: 自己想的复杂度为O(n)O(n)O(n)的算法,若用二分查找则: 1.代码复杂:2.最坏情况下的二分查找的时间复杂度亦为O(n)O ...

  10. 面试题62. 圆圈中最后剩下的数字

    面试题62. 圆圈中最后剩下的数字 思路:f(n,m) = (f(n-1,m)+m)%n.约瑟夫问题 写法1 class Solution { public:int lastRemaining(int ...

最新文章

  1. list extend 和 append
  2. Android程序如何在代码中改变图片原有的颜色
  3. C语言之结构体以及结构体对齐访问
  4. boost learn notes
  5. PHP中spl_autoload_register()函数用法实例详解
  6. 人类史上最大最好的希望事件
  7. VS.NET 学习方法论——我的VS.NET学习之旅
  8. HALCON示例程序particle.hdev测量小圆部分
  9. java开发 职业技能_java编程开发程序员需要具备哪些职业技能
  10. 利用Mybatis写第一个数据库操作的程序
  11. 【MySQL】语句抓包分析工具MySQL sniffer
  12. 物联网还是泄秘网?嗅探流量即可知用户动向
  13. linux 监控系统资源-内存
  14. OpenGL超级宝典(第7版)笔记10 片段着色器 清单3.10-3.12
  15. Python面向对象版学员管理系统(附源码)
  16. MIT6.828学习之Lab1
  17. 率土之滨服务器维护2月19日,率土之滨连发两封致歉信后,资深月卡党的我决定重新入坑...
  18. Mac版Endnote 20导入中文参考格式Chinese Std GBT7714 (numeric)
  19. 从问题描述到电子运转 思维导图 《计算机系统概论》
  20. TM1621数码管驱动

热门文章

  1. 【VB测绘程序设计】第二章 VB测绘程序基础
  2. 【计算机图形学】实验:C#.net环境下的图形变换完整实验操作流程
  3. CityEngine下如何更好的实现影像与地形叠加
  4. linux之通过strings命令查看so里面是否包含****字符串
  5. Android studio之NDK integration is deprecated in the current plugin解决办法
  6. Android之基于xmpp openfire smack开发之Android客户端开发[3]
  7. 判断只有符号数字 java_java编程 判断输入的字符,数字,及其他符号的个数
  8. 优秀的硕博士们,他们的朋友圈都有什么特点?
  9. 每日一笑 | 最真实的商业模式
  10. 数据挖掘算法之决策树算法总结