2
回答
面试题 类似约瑟夫环
注册华为云得mate10,2.9折抢先购!>>>   

一张桌子围坐n个人,从第一个人开始报数 从1开始,当报数为3或被3整除的时候 这个人退出,再继续报数,接着上一个人,到达末尾后 从第一个人从新开始,这样最后只剩下了一个人  已知这个人的编号是15,求第一个人的编号(编号是连续的)


哪位大侠写写。



举报
梦想生活
发帖于4年前 2回/268阅
共有2个答案 最后回答: 4年前

直接copy @情天大圣    的答案 ,以前有人提过这个问题,代码如下:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Main {

    public static void main(String[] args) {
        final int n = 15;
        final int flag = 3;

        List<Integer> mans = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) {
            mans.add(i + 1);
        }
        System.out.println("初始化编号为" + mans + "的" + mans.size() + "个人围成一圈");

        ListIterator<Integer> iter = null;
        int k = 1;
        do {
            iter = mans.listIterator();
            while (iter.hasNext()) {
                int i = iter.next();
                if (k++ % flag == 0) {
                    System.out.println("编号" + i + "的人退出圈子");
                    iter.remove();
                    k = 1;
                }
            }
        } while (mans.size() > 1);

        System.out.println("剩下编号为" + mans + "的" + mans.size() + "个人");
    }

}

--- 共有 2 条评论 ---
冷血题目上应该是要反推吧?这答案不对吧? 4年前 回复
情天大圣呵呵 4年前 回复

def joseph(n: Int, k:Int, end: Int) = {
  var r = 0
  for(i <- 1 to n) {
    r = (r + k) % i
  }
  end - r
}
assert(joseph(15, 3, 15) == 11)
assert(joseph(16, 3, 15) == 8)
assert(joseph(17, 3, 15) == 5)

顶部