美文网首页iOS经典算法
iOS算法系列(一)- 约瑟夫环

iOS算法系列(一)- 约瑟夫环

作者: DockeriOS | 来源:发表于2019-03-25 19:54 被阅读0次

前言

在开始正题之前要感叹一句:一定要好好学算法,虽然就封装的角度来说,完全可以把前人的算法封装成工具类或分类直接拿来用,但是我们还是很有必要明白其中的原委。不做敲代码的程序猿,只做有灵魂的攻城狮!

废话不多说,开始正题!

约瑟夫环

问题描述:有m个人,围成一个环,编号为 0、1、2、3、、、m-1,从第k个人开始循环报数,假设数到n的那个人出列,然后从下一个人继续数数,数到n出列,以此循环,按顺序输出所有被选出人的编号。

分析如下:
设m为人的个数,n为要数的数,k为从第几个人开始数
首先定义一个存储m个人的数组array,方便遍历时输出
设index为选中人的编号,假设从第一个人开始数那index = -1(因为数组的编号是从0开始的),那么从第k个人开始index = -1+(k-1)
那么数到第n个人的编号就是index = (index+n)%array.count(解释:如果index+n<array.count,那么(index+n)%array.count=index+n,也就是1%2=1,如果还不懂请重温计算机原理)
然后将对应index的元素移除,index--回到上一位重新开始数,当array.count==0时循环结束

直接上代码:

/**
 *  约瑟夫环
 *  @param m  总人数
 *  @param n  报数的长度
 *  @param k  开始位置
 */
- (void)josephCircle:(NSInteger)m length:(NSInteger)n index:(NSInteger)k {
    // 定义一个数组存放m个人
    NSMutableArray *array = [NSMutableArray array];
    for (int i=0; i<n; i++) {
        [array addObject:@(i+1)];
    }
    // 设置index为开始数数的位置
    NSInteger index = -1+(k-1);
    // 当array大于0一直循环
    while (array.count>0) {
        // 取到数到n个人的index
        index = (index+n)%array.count;
        // 打印对应index的编号
        NSLog(@"%zd",[array[index] integerValue]);
        // 将对应index移除
        [array removeObjectAtIndex:index--];
    }
}

相关文章

  • iOS算法系列(一)- 约瑟夫环

    前言 在开始正题之前要感叹一句:一定要好好学算法,虽然就封装的角度来说,完全可以把前人的算法封装成工具类或分类直接...

  • 算法-约瑟夫环

    有一个数组a[n]顺序存放0~n-1,要求每隔step个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉...

  • 约瑟夫环算法

    什么是约瑟夫环呢?约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在...

  • 算法--约瑟夫斯环

    n个人围成一个圆圈,编号为1~n,从第一号开始报数,报到m的倍数的人离开, 一直数下去,直到最后只有一个人, 求此人编号

  • 算法题—约瑟夫环问题

    前言 本文编程语言使用Java 问题概述 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕...

  • 约瑟夫环问题

    约瑟夫环问题约瑟夫环描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围...

  • 约瑟夫算法

    1.约瑟夫算法:约瑟夫环:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的 人开始报数,...

  • 循环单链表实现约瑟夫环(C语言)

    约瑟夫环

  • 约瑟夫环

    题目:100名学生围成一个圈, 编号从1到100,从第一名学生开始报数,从1-9报数 每报出9就退出,直到所有学生...

  • 约瑟夫环

网友评论

    本文标题:iOS算法系列(一)- 约瑟夫环

    本文链接:https://www.haomeiwen.com/subject/ppobvqtx.html