/************************************************************************
题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第
m个数字。求出这个圆圈里剩下的最后一个数字。
************************************************************************/
/*
方法一:用环形链表模拟圆圈
方法二:查找规律
*/
#include <stdio.h>
#include <list>
using namespace std;
// ====================方法1====================
int LastRemaining_Solution1(unsigned int n, unsigned int m)
{
if(n < 1 || m < 1)
return -1;
unsigned int i = 0;
list<int> numbers;
for(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);
}
// ====================方法2====================
int LastRemaining_Solution2(unsigned int n, unsigned 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;
}
// ====================测试代码====================
void Test(char* testName, unsigned int n, unsigned int m, int expected)
{
if(testName != NULL)
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", 5, 3, 3);
}
void Test2()
{
Test("Test2", 5, 2, 2);
}
void Test3()
{
Test("Test3", 6, 7, 4);
}
void Test4()
{
Test("Test4", 6, 6, 3);
}
void Test5()
{
Test("Test5", 0, 0, -1);
}
void Test6()
{
Test("Test6", 4000, 997, 1027);
}
int main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
return 0;
}
==参考剑指offer
分享到:
相关推荐
圆圈中最后剩下的数字.md
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。 思路 将问题建模为函数f(n,m)f(n,m)f(n,m),该函数返回值为最终留下的...
圆圈中最后剩下的数字题目解题思路代码实现实现结果 面试题62. 圆圈中最后剩下的数字 题目来源:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof 题目 0,1,n-1这n个数字排成...
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入:
1.声明一个数组,长度为n,初始化为0,如果被选中的数字,赋值为-1,再做一个总数标记count = n 2.使用index循环遍历数组,每次移动m-1位,找到
它表示如果映射前的数字是x,那么映射后的数字是(x-k-1)%n.该映射的逆映射是p-1(x)= (x+k+1)%n.由于映射之后的序列和最初的序列具有同样的形
题目: 分析: 巧妙的用到了-1 第一次是因为从零开始 之后是因为该数已经删除了。 太巧妙了。 代码:自己写的python class Solution(object): def lastRemaining(self, n, m): list1=list(range(0,n)) ...
么,我们可以递归地求解 f(n - 1, m),就可以知道对于剩下的 n - 1 个元素,最终会留下第几个元素,我们设答案为 x = f(n - 1, m)。我
n个人删掉的第一个人的编号是(m-1)%n,那么n个人时删掉第一个人的后面那个人(m-1+1)%n一定是n-1个人时候编号为0的那个人,即n个人时的编号m%n
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。 示例 1: 输入: n = 5, m = 3输出: 3 示例 2: 输入: n = 10, m = 17输出:...
在排序数组中查找数字.py 二叉搜索树的第k大节点.py ...圆圈中最后剩下的数字.py 股票的最大利润.py 求1+2+…+n.py 不用加减乘除做加法.py 构建乘积数组.py 把字符串转换成整数.py 树中两个节点的最低公共祖先.py
n 个数字(0,1,…,n-1)形成一个圆圈,从数字k开始,每次从这个圆圈中删除第m 个数字(第一个 为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除...求出在这个圆圈中剩下的最后一个数字。
在n个数字中,假设第一个被删除的数字为k,那么删除k之后剩下的n-1个数字为0~k-1,k 1~n-1,并且下一次删除从数字k 1开始计数。第二个序列最后剩下的数字也就是我们要求的数字。于是我们对于剩下的n-1个数字重新编号...
45. 圆圈中最后剩下的数 46. 1+2+3+...+n的和 47. 不用加减乘除做加法 48. 不能被继承的类 49. 字符串转换为整数 50. 树中两个节点的最低公共祖先 51. 找出重复的数 52. 构建乘积数组 53. 正则表达式匹配 ...
M个人围成一圈报数,数到N(1)的倍数或包含N这个数字时出圈,问剩下的最后一个人在原来的位置是多少? 报数规则 1、从第一个人开始报数为1,下一个人报数为上一个人报数加1 2、报数的最大值为2000,如果报数超过...
[数学]圆圈中最后剩下的数字 采访01.06 [字符串]字符串压缩 LeetCode-1162 [图/ BFS]地图分析 LeetCode-1160 [数组/哈希表]拼写单词 LeetCode-1111 [栈]有效括号的嵌套深度 LeetCode-1071 [弦]弦的最大公因子...
圆圈中最后剩下的数字 约瑟夫环 10.4 jz50 第一个只出现一次的字符 哈希表 jz09 两个栈实现队列 (使用LinkedList实现栈),一个栈用来push,另一个栈用来pop jz59-1 滑动窗口最大值 单调队列 jz30 包含min的栈 和上...
圆圈中最后剩下的数字 二叉搜索树的最近公共祖先 二叉树的最近公共祖先 按摩师 中等 序号(力扣题序号) 题名 题解 两数相加 无重复字符的最长子串 字符串转换整数 盛水最多得容器 括号生成 搜索旋转排序数组 全排列 ...
求出在这个圆圈中剩下的最后一个数字。 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字...