`
xitonga
  • 浏览: 585943 次
文章分类
社区版块
存档分类
最新评论

圆圈中最后剩下的数字

 
阅读更多
/************************************************************************
题目: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

    圆圈中最后剩下的数字.md

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

    例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。 思路  将问题建模为函数f(n,m)f(n,m)f(n,m),该函数返回值为最终留下的...

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

    圆圈中最后剩下的数字题目解题思路代码实现实现结果 面试题62. 圆圈中最后剩下的数字 题目来源:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof 题目 0,1,n-1这n个数字排成...

    hairrrrr#1200_Problems#21_圆圈中最后剩下的数字1

    例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入:

    guanjunjian#Interview-Summary#62-圆圈中最后剩下的数字1

    1.声明一个数组,长度为n,初始化为0,如果被选中的数字,赋值为-1,再做一个总数标记count = n 2.使用index循环遍历数组,每次移动m-1位,找到

    PeterXiao#book-001#面试题45:圆圈中最后剩下的数字1

    它表示如果映射前的数字是x,那么映射后的数字是(x-k-1)%n.该映射的逆映射是p-1(x)= (x+k+1)%n.由于映射之后的序列和最初的序列具有同样的形

    leetcode:面试题62. 圆圈中最后剩下的数字—-附python分析

    题目: 分析: 巧妙的用到了-1 第一次是因为从零开始 之后是因为该数已经删除了。 太巧妙了。 代码:自己写的python class Solution(object): def lastRemaining(self, n, m): list1=list(range(0,n)) ...

    圆圈中最后的数字1

    么,我们可以递归地求解 f(n - 1, m),就可以知道对于剩下的 n - 1 个元素,最终会留下第几个元素,我们设答案为 x = f(n - 1, m)。我

    ruoruochen#front-end-note#【剑指Offer 62】圆圈中最后剩下的数字(约瑟夫环)1

    n个人删掉的第一个人的编号是(m-1)%n,那么n个人时删掉第一个人的后面那个人(m-1+1)%n一定是n-1个人时候编号为0的那个人,即n个人时的编号m%n

    leetcode面试题62圆圈中最后剩下的数字java题解(约瑟夫环)

    例如,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输出:...

    为面试做准备的python经典编程题之4

    在排序数组中查找数字.py 二叉搜索树的第k大节点.py ...圆圈中最后剩下的数字.py 股票的最大利润.py 求1+2+…+n.py 不用加减乘除做加法.py 构建乘积数组.py 把字符串转换成整数.py 树中两个节点的最低公共祖先.py

    约瑟夫环问题

    n 个数字(0,1,…,n-1)形成一个圆圈,从数字k开始,每次从这个圆圈中删除第m 个数字(第一个 为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除...求出在这个圆圈中剩下的最后一个数字。

    Python实现约瑟夫环问题的方法

    在n个数字中,假设第一个被删除的数字为k,那么删除k之后剩下的n-1个数字为0~k-1,k 1~n-1,并且下一次删除从数字k 1开始计数。第二个序列最后剩下的数字也就是我们要求的数字。于是我们对于剩下的n-1个数字重新编号...

    《剑指Offer》题目及代码.zip

    45. 圆圈中最后剩下的数 46. 1+2+3+...+n的和 47. 不用加减乘除做加法 48. 不能被继承的类 49. 字符串转换为整数 50. 树中两个节点的最低公共祖先 51. 找出重复的数 52. 构建乘积数组 53. 正则表达式匹配 ...

    出圈问题的C链表实现

    M个人围成一圈报数,数到N(1)的倍数或包含N这个数字时出圈,问剩下的最后一个人在原来的位置是多少? 报数规则 1、从第一个人开始报数为1,下一个人报数为上一个人报数加1 2、报数的最大值为2000,如果报数超过...

    Algorithm:算法渣的挣扎_(

    [数学]圆圈中最后剩下的数字 采访01.06 [字符串]字符串压缩 LeetCode-1162 [图/ BFS]地图分析 LeetCode-1160 [数组/哈希表]拼写单词 LeetCode-1111 [栈]有效括号的嵌套深度 LeetCode-1071 [弦]弦的最大公因子...

    约瑟夫环leetcode-leetcode-everyday:leetcode-每天

    圆圈中最后剩下的数字 约瑟夫环 10.4 jz50 第一个只出现一次的字符 哈希表 jz09 两个栈实现队列 (使用LinkedList实现栈),一个栈用来push,另一个栈用来pop jz59-1 滑动窗口最大值 单调队列 jz30 包含min的栈 和上...

    javalruleetcode-leetcode:力扣算法题解

    圆圈中最后剩下的数字 二叉搜索树的最近公共祖先 二叉树的最近公共祖先 按摩师 中等 序号(力扣题序号) 题名 题解 两数相加 无重复字符的最长子串 字符串转换整数 盛水最多得容器 括号生成 搜索旋转排序数组 全排列 ...

    脑力保健 微软,GOOGLE等试题试做 C#版

    求出在这个圆圈中剩下的最后一个数字。 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字...

Global site tag (gtag.js) - Google Analytics