《剑指offer》第六十二题(圆圈中最后剩下的数字)
// 面试题62:圆圈中最后剩下的数字
// 题目:0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里
// 删除第m个数字。求出这个圆圈里剩下的最后一个数字。 #include <iostream>
#include <list> using namespace std; // ====================方法1====================
//使用环形链表
int LastRemaining_Solution1(unsigned int n, unsigned int m)
{
if (n < || m < )//边界判断
return -; unsigned int i = ; list<int> numbers;//建立一个链表,值为0~n
for (i = ; i < n; ++i)
numbers.push_back(i); list<int>::iterator current = numbers.begin();//设置迭代器
while (numbers.size() > )
{
for (int i = ; 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);//上面循环完就剩一个了
} // ====================方法2====================
//需要严谨的数学公式推导,最终得到如下的公式
int LastRemaining_Solution2(unsigned int n, unsigned int m)
{
if (n < || m < )
return -; int last = ;
for (int i = ; i <= n; i++)
last = (last + m) % i; return last;
} // ====================测试代码====================
void Test(const char* testName, unsigned int n, unsigned int m, int expected)
{
if (testName != nullptr)
printf("%s begins: \n", testName); if (LastRemaining_Solution1(n, m) == expected)
printf("Solution1 passed.\n");
else
printf("Solution1 failed.\n"); if (LastRemaining_Solution2(n, m) == expected)
printf("Solution2 passed.\n");
else
printf("Solution2 failed.\n"); printf("\n");
} void Test1()
{
Test("Test1", , , );
} void Test2()
{
Test("Test2", , , );
} void Test3()
{
Test("Test3", , , );
} void Test4()
{
Test("Test4", , , );
} void Test5()
{
Test("Test5", , , -);
} void Test6()
{
Test("Test6", , , );
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
system("pause");
return ;
}
《剑指offer》第六十二题(圆圈中最后剩下的数字)的更多相关文章
- 剑指offer--孩子们的游戏(圆圈中最后剩下的数字)
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m ...
- (剑指Offer)面试题45:圆圈中最后剩下的数字
题目: 0,1,...n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字. 思路: 1.环形链表模拟圆圈 创建一个n个节点的环形链表,然后每次在 ...
- 剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)
剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)2014-02-05 19:37 题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.H ...
- 《剑指offer》第二十二题(链表中倒数第k个结点)
// 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...
- 《剑指offer》第十二题(矩阵中的路径)
// 面试题:矩阵中的路径 // 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有 // 字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左.右. // 上.下移动 ...
- 剑指Offer(三十二):把数组排成最小的数
剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
- 剑指Offer - 九度1384 - 二维数组中的查找
剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
- 《剑指Offer》面试题-二维数组中的查找
题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到 ...
- 剑指offer【01】- 二维数组中的查找(Java)
在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的 ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
随机推荐
- 如何使用 lsyncd 实时同步并执行 shell 命令
修改 lsyncd 的默认配置,不直接执行rsync 进行同步,而是改用自己的脚本. binary 指定我们的脚本 vim /usr/local/lsyncd/etc/lsyncd.conf sett ...
- 在static的function静态函数中访问成员变量
class A{ private $url; public function __construct(){ $this->url = $_SERVER['PATCH_INFO']; } publ ...
- git获取一个版本相对于另一个版本新增,修改,删除的文件
git diff --name-status 00ef237ef0f0a4b8bd9609c2b6d570472028212d abf13b4d58abbb05a7d494cdc205d025978a ...
- Vue基础进阶 之 Vue生命周期与钩子函数
Vue生命周期 Vue生命周期:Vue实例从创建到销毁的过程,称为Vue的生命周期: Vue生命周期示意图:https://cn.vuejs.org/v2/guide/instance.html#生命 ...
- Linux上的oracle巡检脚本
修改自大神博客:http://www.cnblogs.com/jyzhao/p/5364049.html 脚本巡检的优化:自动化,节省时间. 脚本需加强:巡检结果中有大量的sqlplus连接信息,后期 ...
- NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset
描述 一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...
- OpenJudge cdqz/Data Structure Challenge 2 (Problem 5822) - 可持久化线段树
描述 给一个空数列,有M次操作,每次操作是以下三种之一: (1)在数列后加一个数 (2)求数列中某位置的值 (3)撤销掉最后进行的若干次操作(1和3) 输入 第一行一个正整数M. 接下来M行,每行开头 ...
- 89. a^b【快速幂模板】
a^b Description 求 aa 的 bb 次方对 pp 取模的值. 输入格式 三个整数 a,b,pa,b,p ,在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数 ...
- Java 11 究竟比 8 快了多少?看看这个基准测试
开源规划调度引擎 OptaPlanner 官网发布了一个 Java 11 GC 性能基准测试报告. 当前使用量最大的 Java 版本是 8,所以测试者用 Java 8 与 Java 11 进行对比测试 ...
- mybatis批量更新数据参考
https://blog.csdn.net/xyjawq1/article/details/74129316