锁定老帖子 主题:淘宝面试题 n个人围成一圈,报到m的人出列
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-20
简单实现,未做“求最后一个出列的人”处理。
输出的最后一个数值就是“最后一个出列的人” public class ReportNumber { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("please input two numbers : "); String[] strings = br.readLine().replaceAll("\\s+", "").split(","); int m = Integer.parseInt(strings[0]); int n = Integer.parseInt(strings[1]); LinkedList<Integer> linkedList = new LinkedList<Integer>(); for (int i = 1; i <= n; i++) { linkedList.add(i); } for (int i = 0, j = 1; !linkedList.isEmpty(); i++, j++) { // 如[报数报程中]下标指针到达链表尾部,须从头开始重新报数 if (i == linkedList.size()) { i = 0; } if (j == m) { System.out.printf("%d ", linkedList.remove(i)); // 如[报数完成后]下标指针下标指针到达链表尾部,须从头开始重新报数 if (i == linkedList.size()) { i = 0; } j = 1; } } } } |
|
返回顶楼 | |
发表时间:2011-04-20
bosshida 写道 sunlightcs 写道 useryouyou 写道 if(arr[index] == true){
这个有问题吗? 没问题,不过他想表达的意思是:一般判断true或false,不用“ == ”,直接if(arr[index])就可以了 哦,呵呵 |
|
返回顶楼 | |
发表时间:2011-04-20
147091224 写道 简单实现,未做“求最后一个出列的人”处理。
输出的最后一个数值就是“最后一个出列的人” public class ReportNumber { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("please input two numbers : "); String[] strings = br.readLine().replaceAll("\\s+", "").split(","); int m = Integer.parseInt(strings[0]); int n = Integer.parseInt(strings[1]); LinkedList<Integer> linkedList = new LinkedList<Integer>(); for (int i = 1; i <= n; i++) { linkedList.add(i); } for (int i = 0, j = 1; !linkedList.isEmpty(); i++, j++) { // 如[报数报程中]下标指针到达链表尾部,须从头开始重新报数 if (i == linkedList.size()) { i = 0; } if (j == m) { System.out.printf("%d ", linkedList.remove(i)); // 如[报数完成后]下标指针下标指针到达链表尾部,须从头开始重新报数 if (i == linkedList.size()) { i = 0; } j = 1; } } } } 这样也行了,我哪只是用了一些基础类型实现的了,没有用到LinkedList |
|
返回顶楼 | |
发表时间:2011-04-20
唉,我讨厌算法题。
|
|
返回顶楼 | |
发表时间:2011-04-20
约瑟夫环问题
用个单向循环链表 更好理解 当节点的下结点是他本身的时候就得出答案了 当然链表也可以看着特殊的数组 |
|
返回顶楼 | |
发表时间:2011-04-20
public int find(int n, int m) { int r = 0; for (int i = 2; i <= n; i++) { r = (r + m) % i; } return r + 1; } 以前在论坛里看到过一个实现,说实话我没看懂,但是试了几个都是正确的,希望数学好的朋友来解释下. |
|
返回顶楼 | |
发表时间:2011-04-20
算法可能楼主的没有问题,从面向对象的角度来看,楼主的算法不合格,下面找了个代码,大家看下是否会逻辑更清晰。
public class Josephus { static class Node { int val; Node next; Node(int v) { val = v; } }// 成员类,代表节点,类似于数据结构中的结构体 public static void main(String[] args) { int N = 9;// 这个表示总人数 int M = 5;// 数到几的人出列 Node t = new Node(1);// 头节点单列出来,方便形成循环链表 Node x = t; for (int i = 2; i <= N; i++) x = (x.next = new Node(i));// 建立单向链表 x.next = t;// 最后一个节点的next指向第一个节点,形成循环链表 System.out.println("出圈的顺序为:"); while (x != x.next) { for (int i = 1; i < M; i++) x = x.next; // 此时x是将出列的节点的前一个节点 System.out.print(x.next.val + " "); x.next = x.next.next; } System.out.println(); System.out.println("Survivors is " + x.val); }// end main } 参考地址:http://yxxiao0929.blog.chinajavaworld.com/entry/8129/0/ |
|
返回顶楼 | |
发表时间:2011-04-20
albertshaw 写道 public int find(int n, int m) { int r = 0; for (int i = 2; i <= n; i++) { r = (r + m) % i; } return r + 1; } 以前在论坛里看到过一个实现,说实话我没看懂,但是试了几个都是正确的,希望数学好的朋友来解释下. 终于找到这个解法 |
|
返回顶楼 | |
发表时间:2011-04-20
我记得 5行就可以搞定的
|
|
返回顶楼 | |
发表时间:2011-04-20
albertshaw 写道 public int find(int n, int m) { int r = 0; for (int i = 2; i <= n; i++) { r = (r + m) % i; } return r + 1; } 以前在论坛里看到过一个实现,说实话我没看懂,但是试了几个都是正确的,希望数学好的朋友来解释下. f(1,m)=0 f(n,m)=(f(n-1,m)+m)%n |
|
返回顶楼 | |