程序员面试金典——番外篇之约瑟夫问题2

参考网址:https://www.nowcoder.com/profile/9270572/codeBookDetail?submissionId=15779150

Solution1:

解题思路:在c++中利用vector来做
1. 每一轮报数完毕之后,将vector尾部节点复制到首部同时删除尾部结点,开始新一轮的报数。
2. vector中仅剩一个节点,程序结束。
3. 举个例子:假设n = 24,第一个人编号为1。
(1)第一轮:依次报1,2,1,2…然后报到2的人出局,则第一轮过后未出局的编号为1、3、5、7、9、11、13、15、17、19、21、23;
(2)第二轮:从上一轮最后一个报数的人开始依次报1,2,3,1,2,3…报到2,3的人出局。我这里做的处理是,先将上一轮最后一个报数的编号移动到最前面,即23、1、3、5、7、9、11、13、15、17、19、21;然后开始第二轮报数,未出局的编号为23、5、11、17;
(3)第三轮:从上一轮最后一个报数的人开始依次报1,2,3,4,1,2,3,4…报到2,3,4的人出局。同样,我这里做的处理是,先将上一轮最后一个报数的编号移动到最前面,即17、23、5、11;然后开始第三轮报数,未出局的编号为17,此时链表中仅剩一个节点,故程序结束。
PS:这思路是真好,菜鸡啥时候长大

class Joseph {
public:int getResult(int n) {// write code herevector<int> ysf;for (int i = 1; i <= n; i++) ysf.push_back(i);int m = 2;vector<int> temp;while (ysf.size() != 1) {temp.push_back(0);for (size_t i = 1; i <= ysf.size(); i += m) {temp.push_back(ysf[i - 1]);}temp[0] = temp.back();temp.erase(temp.end() - 1);ysf.swap(temp);//swap函数的两种用法均可//swap(ysf, temp);temp.clear();m++;}return ysf.back();}
};

vector中swap函数的用法

《C++ Primer》第五版P303中写到:swap操作交换两个相同类型容器的内容。调用swap后,两个容器中的元素会交换。
除此之外,可以利用swap对vector的内存进行强制释放

template < class T> void ClearVector( vector<T>& v )
{ vector<T>vtTemp;vtTemp.swap( v );
}
如 vector<int> v ;nums.push_back(1);nums.push_back(3);nums.push_back(2);nums.push_back(4);vector<int>().swap(v);/* 或者v.swap(vector<int>()); *//*或者{ std::vector<int> tmp = v;   v.swap(tmp);   }; //加大括号{ }是让tmp退出{ }时自动析构*/

参考:
一个关于c++中vector函数各种用法总结的博客:C++中 vector(容器)的用法
https://www.cnblogs.com/yoke/p/6080080.html

程序员面试金典——番外篇之约瑟夫问题2相关推荐

  1. 程序员面试金典——番外篇之约瑟夫问题1

    程序员面试金典--番外篇之约瑟夫问题1 Solution1:我的答案.脑子是个好东西,希望我总是带着他~ 该算法模拟了游戏过程,不算好. 要理清逻辑关系,因果关系,再下笔~ class Joseph ...

  2. 程序员面试金典——番外篇之下一个较大元素II

    程序员面试金典--番外篇之下一个较大元素II Solution1:我的答案,时间复杂度为O(n2)O(n2)O(n^2) 垃圾算法 class NextElement { public:vector& ...

  3. 程序员面试金典——番外篇之下一个较大元素I

    程序员面试金典--番外篇之下一个较大元素I Solution1:我的答案,时间复杂度为O(n2)O(n2)O(n^2) 垃圾算法 class NextElement { public:vector&l ...

  4. 【重点】程序员面试金典——番外篇之数组中的逆序对

    程序员面试金典--番外篇之数组中的逆序对 此题曾多次遇到,然鹅还是本能的想起来复杂度为O(n2)O(n2)O(n^2)的笨蛋方法... Solution1:笨蛋方法 class AntiOrder { ...

  5. 【To Understand】程序员面试金典——番外篇之洪水

    程序员面试金典--番外篇之洪水 参考网址:https://www.nowcoder.com/profile/1917743/codeBookDetail?submissionId=12679910 S ...

  6. 程序员面试金典--笔记(精华篇)

    原文链接:http://codeshold.me/2017/01/cracking_interview.html <程序员面试金典> 1-7章的总结 相关读物<金领简历:敲开苹果.微 ...

  7. 《程序员面试金典》+《算法导论》

    <程序员面试金典>+<算法导论> 因为最近可能会面临一波面试,但是自己各种算法以及常见的问题的熟悉程度感觉还不够,但是由前几次的代码优化经验来看,算法优化可以说是代码优化的重中 ...

  8. C#LeetCode刷题-程序员面试金典

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-程序员面试金典 | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode程序员面试金典 ...

  9. 《程序员面试金典(第6版)》面试题 16.13. 平分正方形(直线的斜截式方程,C++)

    题目描述 给定两个正方形及一个二维平面.请找出将这两个正方形分割成两半的一条直线.假设正方形顶边和底边与 x 轴平行. 每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = [ ...

最新文章

  1. 吐血整理:24种可视化图表优缺点对比,一图看懂!
  2. cookie存值和page分页
  3. react native 学习笔记
  4. python解密md5值_Python之POST提交解密MD5
  5. hive 解密_hive 中自定义 base64 加密 解密 UDF 函数
  6. epoll 边沿触发(ET 模式)和水平触发(LT 模式)
  7. 虫师python appium自动化测试书_基于python的Appium自动化测试的坑
  8. 二叉查找树 java代码实现
  9. 咬文嚼字:刹车错当油门酿车祸?!
  10. 49个Python学习资源:从初学者到高级玩家都有了
  11. 所有编程语言为我作证,随机数骗局大揭秘,随机数都是骗人的!
  12. Server2008 安装 Zune
  13. 中英文国际机场三字代码
  14. matlab求解全微分函数,Matlab求解一元函数,再求全微分的错误,表达式复杂不会........
  15. 智能家居控制系统制作技术_智能家居控制系统是什么_智能家居控制系统的由来-装修攻略...
  16. zookeeper因内存不足造成的CPU占用率高
  17. 班级网站(网页设计实验)
  18. ff14 掉线 服务器维护,《FF14》29日更新维护 暂不推出手工补丁
  19. c语言初步实验报告,c语言实验报告(大一c语言实验报告答案)
  20. 关于ARM9中的协处理器CP15及MCR/MRC指令

热门文章

  1. VS2015 调试代码时写入位置时发生访问冲突
  2. java的if else if_java,if else和if else if else区别?
  3. 添加库文件_S7200的库文件导至200SMART正确操作
  4. 深度学习(01)——安装anaconda
  5. osqa mysql_osqa安装出现的问题解决办法 | 学步园
  6. python远程linux服务器执行命令_基于使用paramiko执行远程linux主机命令(详解)
  7. 16级大一c语言考试题及答案,2013年计算机二级C语言上机试题十六及答案
  8. jsp action java_jsp中Action使用session方法实例分析
  9. 利用html制作通讯录_动漫制作软件哪些好用?动漫制作软件推荐
  10. anaconda pycharm_使用Pycharm在anaconda环境下安装pygame库